Насколько я понимаю, .chars
состоит в том, что он возвращает «количество символов в строке в графемах». Насколько я понимаю, .ords
состоит в том, что он возвращает «список номеров кодовых точек, по одному для базового символа каждой графемы в строке» < / а>. То есть .chars
возвращает количество графем, а .ords
возвращает одну кодовую точку (основание) для каждой графемы. Однако поведение, которое я наблюдаю в Rakudo 2016.07.1 на MoarVM 2016.07, похоже, не соответствует этому:
> "\x[2764]\x[fe0e]".chars
1
> "\x[2764]\x[fe0e]".ords.fmt("U+%04x")
U+2764 U+fe0e
> "e\x[301]".ords.fmt("U+%04x")
U+00e9
> "0\x[301]".ords.fmt("U+%04x")
U+0030
Метод .chars
возвращает ожидаемое значение 1 для HEAVY BLACK HEART и VARIATION SELECTOR-15 (текстовое представление ❤︎ вместо эмодзи ❤️, U + 2764 U + fe0f), но затем .ords
возвращает обе кодовые точки, а не только базу (я ожидал только U +2764). Еще больше сбивает с толку то, что если вы вызовете .ords
на ЛАТИНСКОЙ СТРОЧНОЙ БУКВЕ E и СОЧЕТАЯ ОСТРЫЙ АКЦЕНТ, вы вернетесь U + 00e9 (СТРОЧНАЯ ЛАТИНСКАЯ БУКВА E С ОСТРЫМ). Я ожидал U + 0065, поскольку ЛАТИНСКАЯ СТРОЧНАЯ БУКВА E является базовой кодовой точкой. Я получаю ожидаемый результат, когда нет версии строки NFC (например, U + 0030 для 0 ').
Я неправильно понимаю .chars
и .ords
или это ошибка?