Подтвердить что ты не робот

Как проверить равенство строк Unicode в Javascript?

У меня две строки в 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 и диакритику ¨ в качестве отдельного символа. Какое сравнение я могу сделать, чтобы эти две строки были равны?

4b9b3361

Ответ 1

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

f1 находится в Нормальная форма C (составлена) и f2 в нормальной форме D (разложена). Обычно обычная форма C является наиболее распространенной в Windows и в Интернете, и в Unicode FAQ описывается ее как "лучшая форма для общего текста". К сожалению, мир 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), где у вас есть язык с улучшенными возможностями.