Как проверить равенство строк Юникода в Javascript? - PullRequest
17 голосов
/ 17 августа 2011

У меня есть две строки в Javascript: "_strange_chars_µö¬é@zendesk.com.eml" (f1) и "_strange_chars_µö¬é@zendesk.com.eml" (f2).На первый взгляд, они выглядят одинаково (и, действительно, в StackOverflow они могут быть; я не уверен, что происходит, когда они вставляются в такую ​​форму). В моем приложении, однако,

f1[16] // ö
f2[16] // o
f1[17] // ¬
f2[17] // ̈

То есть, когда f1 использует символ ö , f2 использует o и диакритический знак ¨ в качестве отдельного символа.Какое сравнение я могу сделать, чтобы показать, что эти две строки "равны"?

1 Ответ

8 голосов
/ 18 августа 2011

f1 использует символ ö, f2 использует o и диакритический знак ¨ как отдельный символ.

f1 находится в Нормальная форма C (составлено) и f2 в Нормальной форме D (разложено). В общем, обычная форма C является наиболее распространенной в Windows и в Интернете. Часто задаваемые вопросы по Unicode описывают ее как «лучшую форму для общего текста». К сожалению, мир Apple расширился до Нормальной Формы D, чтобы быть совершенно другим.

Строки канонически эквивалентны по правилам Эквивалентность Unicode .

Какое сравнение я могу сделать, чтобы эти две строки были "равны"?

Как правило, вы конвертируете обе строки в одну обычную форму по вашему выбору, а затем сравниваете их. Например, в Python:

>>> import unicodedata
>>> a= u'\u00F6'  # ö composed
>>> b= u'o\u0308' # o then combining umlaut
>>> unicodedata.normalize('NFC', a)==unicodedata.normalize('NFC', b)
True

Аналогично, в Java есть класс Normalizer, в .NET - String.Normalize, и языки могут иметь привязки, доступные для библиотеки ICU, которая также предлагает эту функцию.

К сожалению, JavaScript не имеет встроенной возможности нормализации Unicode. Это означает либо:

  • делая это самостоятельно, перемещаясь по большим таблицам данных Unicode, чтобы покрыть все это в JavaScript (см., Например, здесь для примера реализации); или

  • отправка его обратно на серверную часть (например, через XMLHttpRequest), где для этого у вас есть более оснащенный язык.

...