Даст ли нормализация строки тот же результат, что и нормализация отдельных кластеров графем? - PullRequest
1 голос
/ 11 июля 2019

Будет ли результат выполнения нормализации Unicode над строкой (при условии отсутствия изолированных объединяющих символов) таким же, как результат разделения строки на кластеры графем, нормализации каждого кластера по отдельности с последующим объединением нормализованных кластеров графем? (Если это так, относится ли это только к подмножеству форм нормализации?)

Обсуждаем это главным образом из интереса к тому, как работает Unicode, и выясняем, какие потенциальные крайние случаи могут быть, а не как часть конкретного приложения.

1 Ответ

4 голосов
/ 12 июля 2019

Нет, это вообще не так. Стандарт Unicode предостерегает против предположения, что конкатенация нормализованных строк создает другую нормализованную строку. От UAX # 15 :

При использовании функций нормализации важно понимать, что нет форм нормализации закрыты при конкатенации строк. Тот есть, даже если две строки X и Y нормализованы, их строка конкатенация X + Y не гарантированно нормализуется.

Многие аспекты алгоритма сегментации текста Unicode являются настраиваемыми; стандарт в основном просто предоставляет значения по умолчанию, которые полезны в большинстве контекстов, но могут быть переопределены при необходимости для определенной цели. Следовательно, нет никакой гарантии, что два Unicode-совместимых приложения будут даже договариваться о том, где расположены границы графемы. Конкретным примером является разница между устаревшими кластерами графем и расширенными кластерами графем .

В первом случае символы со значениями свойства Grapheme_Cluster_Break Spacing_Mark или Prepend не действуют как расширители графемы, в то время как во втором они действуют. Начиная с Unicode 12.1, существует двенадцать таких символов с ненулевым каноническим классом объединения . Эти символы сломали бы ваш метод, если бы вы использовали устаревшее определение кластера графем, например, в следующей последовательности:

<U+1D158, U+1D16D, U+1D166>

, что

  • МУЗЫКАЛЬНЫЙ СИМВОЛ ЧЕРНЫЙ (ccc = 0)
  • ТОЧКА СОЧЕТАНИЯ КОМБИНИРОВАНИЯ МУЗЫКАЛЬНОГО СИМВОЛА (ccc = 226)
  • МУЗЫКАЛЬНЫЙ СИМВОЛ, СОЧЕТАЮЩИЙ СТРЕМ СПРЕЧГЕСАНГА (ccc = 216)

Поскольку как объединяющая точка аугментации, так и объединяющий стебель sprechgesang равны Spacing_Mark, эта последовательность фактически разделена на три унаследованных графемных кластера, каждый длиной всего один символ, и, таким образом, автоматически нормализуется. Реальная нормализация всей строки поменяет положение точки и основы, однако, из-за их значений CCC.

Если мы игнорируем возможность настройки алгоритма и фокусируемся только на кластерах расширенных графем, строго как определено в стандарте, то нормализация каждого кластера графем по отдельности должна дать тот же результат, что и нормализация всей строки сразу Насколько я знаю, но нет официальной гарантии, что будущие пересмотры стандарта не изменят это.

...