Почему NFKC нормализует все цифры не работает? - PullRequest
1 голос
/ 08 марта 2019

In JavaScript Я использую NFKC нормализацию через String.prototype.normalize для нормализации полной ширины к стандартным символам полуширины ASCII.

'1'.normalize('NFKC') === '1'
> true

Однако, глядя на более неясные цифры, такие как ૫ , чтоцифра 5 в гуджарати не нормализуется.

'૫'.normalize('NFKC') === '5'
> false

Что мне не хватает?

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Вы ищете не ту проблему.

Юникод - это основная цель кодирования символов (без потери информации).Шрифты и другие программы должны иметь возможность интерпретировать такие символы и давать глиф (в соответствии с кодовой точкой комбинации, соседними символами и другими характеристиками вне кодовых точек [например, язык, эпоха, характеристика шрифта [сценарий и не сценарий, прописные буквы, курсив и т. Д.Изменяет, как комбинировать символы и лигатуру (а также форму глифа).

Существует две основные нормализации (каноническая и совместимая) [и два варианта: разлагается и составляется, когда это возможно]. Каноническая нормализация удаляет ненужные символы (повторение) и порядок составления символов стандартным способом. Совместимая нормализация удаляет «совместимые символы»: символы в Unicode, чтобы не потерять информацию при преобразовании в другую кодировку и из нее.

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

Это было о нормализации.

Но вы хотите получить числовое значение символа Юникод (предупреждение: оно может зависеть от других символов, положения и т. Д.).

База данных Unicode также предоставляет такое свойство.

С Javascript вы можете использовать пакет javasript-свойств unicode-properties , который предоставляет вам также функцию getNumericValue(codePoint).Эти пакеты, кажется, используют эффективное сжатие базы данных, но я не знаю, насколько быстро это может быть.База данных огромна.

1 голос
/ 08 марта 2019

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

Символ ‘1’ (FULLWIDTH DIGIT ONE) по сути является просто символом «1» (DIGIT ONE) с немного другим стилем и не был бы закодирован, если бы он не был необходим для совместимости. Они - в некоторых контекстах - полностью взаимозаменяемы, поэтому первому было назначено отображение разложения на второе. Символ ‘૫’ (GUJARATI DIGIT FIVE) не имеет отображения декомпозиции, поскольку он не является вариантом какого-либо другого символа; это отдельная вещь.

Вы можете обратиться к базе данных символов Unicode, чтобы увидеть, какие символы разлагаются, а какие (то есть большинство из них) нет. Ссылка на инструмент, который вы разместили как часть вашего вопроса, показывает, например, что ૫ не изменяется ни при какой форме нормализации Юникода.

...