Ответ 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), где у вас есть язык с улучшенными возможностями.