Все, чого ти ніколи не хотів знати про нормалізацію Unicode
Канонічна нормалізація
Unicode включає кілька способів кодування деяких символів, особливо помітних символів. Канонічна нормалізація змінює кодові точки на канонічну форму кодування. Отримані в результаті кодові точки повинні бути ідентичними вихідним, що забороняють будь-які помилки в шрифтах або системі відображення.
Коли використовувати
Оскільки результати здаються однаковими, завжди безпечно застосовувати канонічну нормалізацію до рядка перед його збереженням або відображенням, якщо ви можете допустити, що результат не є бітовим для біт-ідентичного вводу.
Канонічна нормалізація буває 2 форм: NFD і NFC. Дві рівнозначні в тому сенсі, що можна конвертувати між цими двома формами без втрат. Порівняння двох рядків під NFC завжди дасть той самий результат, що і порівняння їх за 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, виходячи з можливих компромісів простір / швидкість або на основі того, що вимагається тим, з чим ви взаємодієте.