Равенство эквивалентных строк Юникода

330
Prem

У меня есть вопрос о равенстве эквивалентных строк Unicode, и я дал немного кода на Python, но это может быть общий вопрос для всех языков программирования, таких как C, C ++, Perl или Java.

У меня есть строка u, которая отображает глиф, который является 05D1 (СТАВКА на ивритскую букву), включающий 05BC (чертёж еврейской точки) и 05B8 (каматс еврейской точки)

У меня есть другая строка v, которая также отображает тот же самый глиф, который является 05D1 (СТАВКА НА ИВРИТИЧЕСКУЮ БУКВУ), включающую 05B8 (КАМАТЫ ОРИГИНАЛЬНОГО ТОЧКА) и 05BC (ДАЙШЕВОЙ ТОЧКИ ИВРИТА)

Разница заключается в порядке включения или объединения «ТОЧКИ». Многие другие языки и буквы в Unicode могут включать или комбинировать с другими ТОЧКАМИ для создания глифа.

Теперь u и v практически и визуально представляют собой один и тот же глиф, но его нельзя сравнить наивно в Python:

>>> u='\u05D1\u05BC\u05B8' >>> v='\u05D1\u05B8\u05BC' >>> u 'בָּ' >>> v 'בָּ' >>> u==u True >>> v==v True >>> >>> u==v False >>> v==u False >>> u is v False >>> 

Когда я создаю веб-страницу с этими глифами, просматриваю веб-страницу и выполняю поиск глифа, даже Mozilla FireFox рассматривает эти два как отличительные, но Google Chrome обрабатывает их как одинаковые. Очевидно, что Python и FireFox проверяют байтовое равенство, в то время как Chrome не проверяет байтовое равенство, но каким-то образом выясняет, что оба они одинаковы.

Каков алгоритм проверки равенства эквивалентных строк Unicode в Python?

1
Информация здесь https://en.wikipedia.org/wiki/Unicode_equivalence, по-видимому, предполагает, что это не тривиальная проблема ...... Prem 5 лет назад 1

0 ответов на вопрос

Похожие вопросы