Может ли нормализация NFC Unicode увеличить длину строки?
Если я применю форму C нормализации Unicode к строке, будет ли когда-либо увеличиваться число кодовых точек в строке?
1 ответ
Да, есть кодовые точки, которые расширяются до нескольких кодовых точек после применения нормализации NFC. Например, в базовой многоязычной плоскости есть 70 кодовых точек, которые расширяются до 2 кодовых точек после применения нормализации NFC, и есть 2 кодовые точки (U+FB2C и U+FB2D в блоке буквенных форм представления), которые расширяются до 3 кодовые точки.
Одна из гарантий того, что у вас есть этот так называемый "коэффициент расширения", заключается в том, что ни одна строка никогда не будет расширяться более чем в 3 раза (с точки зрения количества единиц кода) после применения нормализации NFC:
Существует также политика стабильности Unicode Consortium, согласно которой канонические отображения всегда ограничены во всех версиях Unicode, так что ни одна строка при разложении с помощью NFC не увеличивается до длины более чем в 3 раза (измеряется в единицах кода). Это верно, независимо от того, есть ли текст в UTF-8, UTF-16 или UTF-32. Эта гарантия также допускает определенную оптимизацию при обработке, особенно при определении размеров буфера.
Раздел 9, Обнаружение форм нормализации. UAX #15: формы нормализации Unicode.
Я написал программу на Java, чтобы определить, какие кодовые точки в блоке Unicode расширяются до нескольких кодовых точек: http://ideone.com/9PUOCb
Кроме того, tchrist unichars
может использоваться утилита, являющаяся частью CPAN-модуля Unicode:: Tussle. (Примечание: пользователи Mac могут увидеть ошибку на make test
шаг установки, говорящий, что версия Perl слишком старая. Если вы видите эту ошибку, вы можете установить модуль, запустив notest install Unicode::Tussle
в оболочке CPAN.)
Примеры:
Выведите кодовые точки в BMP, которые расширяются до 3 кодовых точек:
длина unichars (NFC) == 3'
IN U + FB2C ПИСЬМО в древнееврейском стиле с DAGESH и SHIN DOT IN U+FB2D ПИСЬМО в древнееврейском стиле с DAGESH и SIN DOT
Подсчитайте количество кодовых точек во всех плоскостях, которые расширяются до более чем одной кодовой точки:
unichars -a 'длина (NFC) > 1' | туалет
85
См. Также часто задаваемый вопрос. Каковы максимальные коэффициенты расширения для различных форм нормализации?