Все, что вы никогда не хотели знать о нормализации Unicode
Каноническая нормализация
Юникод включает несколько способов кодирования некоторых символов, в первую очередь символов с диакритическими знаками. Каноническая нормализация превращает кодовые точки в каноническую форму кодирования. Результирующие точки кода должны выглядеть идентичными исходным, за исключением каких-либо ошибок в шрифтах или механизме рендеринга.
Когда использовать
Поскольку результаты кажутся идентичными, всегда безопасно применять каноническую нормализацию к строке перед ее сохранением или отображением, если вы можете допустить, чтобы результат не был побитно идентичным входному.
Каноническая нормализация бывает двух видов: NFD и NFC. Эти две формы эквивалентны в том смысле, что можно конвертировать между этими двумя формами без потерь. Сравнение двух строк в NFC всегда будет давать тот же результат, что и их сравнение в NFD.
NFD
В NFD персонажи полностью раскрыты. Это более быстрая форма нормализации для вычисления, но приводит к большему количеству кодовых точек (т. Е. Использует больше места).
Если вы просто хотите сравнить две строки, которые еще не нормализованы, это предпочтительная форма нормализации, если вы не знаете, что вам нужна нормализация совместимости.
NFC
NFC рекомбинирует кодовые точки, когда это возможно, после запуска алгоритма NFD. Это занимает немного больше времени, но приводит к более коротким строкам.
Нормализация совместимости
Unicode также включает в себя множество символов, которые действительно не принадлежат, но использовались в устаревших наборах символов. Unicode добавил их, чтобы текст в этих наборах символов обрабатывался как Unicode, а затем конвертировался обратно без потерь.
Нормализация совместимости преобразует их в соответствующую последовательность «реальных» символов, а также выполняет каноническую нормализацию. Результаты нормализации совместимости могут не совпадать с оригиналами.
Символы, содержащие информацию о форматировании, заменяются на те, которых нет. Например, персонаж ⁹
преобразуется в 9
. Другие не связаны с различиями в форматировании. Например, римская цифра Ⅸ
преобразуется в обычные буквы IX
.
Очевидно, что после выполнения этого преобразования преобразование без потерь к исходному набору символов больше невозможно.
Когда использовать
Консорциум Unicode предлагает рассматривать нормализацию совместимости как ToUpperCase
преобразование. Это то, что может быть полезно в некоторых обстоятельствах, но вы не должны применять его волей-неволей.
Отличным вариантом использования будет поисковая система, поскольку вы, вероятно, захотите, чтобы поиск 9
соответствовал ⁹
.
Одна вещь, которую вам, вероятно, не следует делать, - это отображать пользователю результат применения нормализации совместимости.
NFKC / NFKD
Форма нормализации совместимости бывает двух видов: NFKD и NFKC. У них такие же отношения, как между NFD и C.
Любая строка в NFKC по своей сути также находится в NFC, и то же самое для NFKD и NFD. Таким образом NFKD(x)=NFD(NFKC(x))
, и NFKC(x)=NFC(NFKD(x))
т. Д.
Вывод
Если сомневаетесь, используйте каноническую нормализацию. Выберите NFC или NFD на основе применимого компромисса между пространством и скоростью или на основе того, что требуется для чего-то, с чем вы взаимодействуете.