Нет, это вообще не так. Стандарт 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.
Если мы игнорируем возможность настройки алгоритма и фокусируемся только на кластерах расширенных графем, строго как определено в стандарте, то нормализация каждого кластера графем по отдельности должна дать тот же результат, что и нормализация всей строки сразу Насколько я знаю, но нет официальной гарантии, что будущие пересмотры стандарта не изменят это.