Как преобразовать объединенные символы UTF8 в отдельные символы UTF8 в ruby? - PullRequest
14 голосов
/ 04 августа 2011

Некоторые символы, такие как Unicode-символ 'LATIN SMALL LETTER C WITH CARON', могут быть закодированы как 0xC4 0x8D, но также могут быть представлены двумя кодовыми точками для 'LATIN SMALL LETTER C' и 'COMBINING CARON', которыеis 0x63 0xcc 0x8c.
Больше информации здесь: http://www.fileformat.info/info/unicode/char/10d/index.htm

Интересно, есть ли библиотека, которая может конвертировать 'LATIN SMALL LETTER C' + 'COMONINING CARON' в 'LATIN SMALL LETTER C WITHCARON.Или есть таблица, содержащая эти преобразования?

Ответы [ 3 ]

7 голосов
/ 04 августа 2011

Эти преобразования не всегда существуют.Например, комбинация U + 0063 (c) с U + 030C (объединяющая caron) может быть представлена ​​как один символ, но нет предварительно составленного символа, представляющего строчную букву w с caron (w car).

Тем не менее, существуют библиотеки, которые могут выполнять эту композицию, где это возможно.Ищите функцию Unicode под названием «NFC» (Форма нормализации: Композиция).См., Например: http://unicode -utils.rubyforge.org / classes / UnicodeUtils.html # M000015

6 голосов
/ 04 августа 2011

Обычно для этого используется нормализация Юникода.

Использование UnicodeUtils.nfkc с использованием гема unicode_utils (https://github.com/lang/unicode_utils) должно дать вам конкретное поведение, которое вы запрашиваете; форма нормализации Юникода kCбудет использовать декомпозицию совместимости с последующим преобразованием строки в составленную форму, если она доступна (в основном то, что вы просили в вашем примере). (Вы также можете приблизиться к тому, что вы хотите, с помощью формы нормализации c, иногда сокращенно NFC).

Как заменить гем Unicode на Ruby 1.9? содержит дополнительные сведения.

В Ruby 1.8.7 вам нужно будет выполнить установку gem Unicode, для которой естьдоступна аналогичная функция.

Отредактировано, чтобы добавить: Основная причина, по которой вы, вероятно, захотите использовать форму нормализации kC вместо простой формы нормализации C, заключается в том, что лигатуры (символы, сжатые по историческим / типографским причинам) сначала будутразлагается на отдельных персонажей, что иногда желательно, если вы делаетеxicographic заказ или поиск).

0 голосов
/ 02 марта 2014

String # encode можно использовать начиная с Ruby 1.9. UTF-8-MAC является вариантом NFD. Кодовые точки в диапазоне между U + 2000 и U + 2FFF или U + F900 и U + FAFF, или U + 2F800 и U + 2FAFF не разлагаются Смотрите https://developer.apple.com/library/mac/qa/qa1173/_index.html для деталей. UTF-8-HFS также может использоваться вместо UTF-8-MAC.

# coding: utf-8

s = "\u010D"
s.encode!('UTF-8-MAC', 'UTF-8')
s.force_encoding('UTF-8')

p "\x63\xcc\x8c" == s
p "\u0063" == s[0]
p "\u030C" == s[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...