Рассмотрят следующий Ruby-код анализ UTF-8 строки из трех байт:Подсчет Unicode длины строки без сочетающих знаков
#encoding: utf-8
s = "\x65\xCC\x81"
p [s.bytesize, s.length, s, s.encoding.name]
#=> [3, 2, "é", "UTF-8"]
Как описано on this page of mine выше действительно является два-символьной строкой: Латинская строчной e
затем Combining Acute Accent. Тем не менее, он выглядит как один символ, и это имеет значение при размещении дисплеев фиксированной ширины.
Например, посмотрите на две записи для «moiré.svg» на this directory listing и обратите внимание, как один из них перепутал выравнивание столбцов.
Как вычислить «моноширинную визуальную длину» строки в Ruby, которая не включает символы объединения нулевой ширины? (Один действительный метод может быть способ, чтобы преобразовать строку Unicode в ее каноническом представлении, перевернув выше в "\xC3\xA9"
, который также выглядит как é
но имеет length
из 1
.)
Какая версия Ruby у вас есть? Я попробовал ваш пример и получил '[3, 3," é "]'. –
@IliaFrenkel Вышеупомянутое относится к Ruby 1.9 с кодировкой UTF-8 для строк. Я редактировал код, чтобы показать волшебный комментарий, который потребуется для автономного скрипта в любой системе, где UTF-8 не является значением по умолчанию. – Phrogz