Все, что вы никогда не хотели знать о нормализации Unicode
Каноническая нормализация
Unicode включает в себя несколько способов кодирования некоторых символов, особенно ударных.Каноническая нормализация изменяет кодовые точки в каноническую форму кодирования.Результирующие кодовые точки должны быть идентичны исходным, исключая любые ошибки в шрифтах или механизме рендеринга.
Когда использовать
Поскольку результаты выглядят идентичными, всегда безопасно применять каноническую нормализациюв строку перед ее сохранением или отображением, при условии, что вы можете допустить, что результат не будет бит за битом идентичен входному значению.
Каноническая нормализация имеет 2 формы: NFD и NFC.Они эквивалентны в том смысле, что можно конвертировать эти две формы без потерь.Сравнение двух строк в NFC всегда даст тот же результат, что и сравнение в NFD.
NFD
NFD полностью расширяет символы.Это более быстрая форма нормализации для вычисления, но в результате получается больше кодовых точек (т. Е. Используется больше места).
Если вы просто хотите сравнить две строки, которые еще не нормализованы, это предпочтительная форма нормализации, если тольковы знаете, что вам нужна нормализация совместимости.
NFC
NFC по возможности рекомбинирует кодовые точки после запуска алгоритма NFD.Это занимает немного больше времени, но приводит к более коротким строкам.
Нормализация совместимости
Юникод также включает в себя множество символов, которые на самом деле не принадлежат, но использовались в устаревших наборах символов.Юникод добавил их, чтобы позволить тексту в этих наборах символов обрабатываться как Юникод, а затем преобразовываться обратно без потерь.
Нормализация совместимости преобразует их в соответствующую последовательность «реальных» символов, а также выполняет каноническую нормализацию.Результаты нормализации совместимости могут не совпадать с оригиналами.
Символы, содержащие информацию о форматировании, заменяются на те, которые не содержат.Например, символ ⁹
преобразуется в 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 в зависимости от соотношения между пространством и скоростью или в зависимости от того, с чем вы взаимодействуете.