Может ли нормализация 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 

См. Также часто задаваемый вопрос. Каковы максимальные коэффициенты расширения для различных форм нормализации?

Другие вопросы по тегам