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), где для этого у вас есть более оснащенный язык.