Сравнение строк Javascript не выполняется при сравнении символов Юникода
Я хочу сравнить две строки в JavaScript, которые одинаковы, и все же оператор равенства ==
возвращает false. Одна строка содержит специальный символ (например. датчанин!--2-->).
JavaScript код:
var filenameFromJS = "Designhåndbog.pdf";
var filenameFromServer = "Designhåndbog.pdf";
print(filenameFromJS == filenameFromServer); // This prints false why?
решение Что работал для меня является нормализация Unicode как slevithan указал.
Я разветвил свой оригинальный jsfiddle, чтобы сделать версию, используя нормализацию lib, предложенную slevithan. Ссылка на сайт: http://jsfiddle.net/GWZ8j/1/.
4 ответов
В отличие от того, что некоторые другие люди здесь сказали, это не имеет ничего общего с кодировками. Вместо этого две строки используют разные кодовые точки для отображения одних и тех же визуальных символов.
чтобы решить эту проблему правильно, вам нужно выполнить нормализацию Unicode для двух строк перед их сравнением. К сожалению, JavaScript не имеет этой встроенной функции. Вот библиотека JavaScript, которая может выполнить нормализацию для вас: https://github.com/walling/unorm
оператор равенства JavaScript ==
будет казаться, что сбой при следующих обстоятельствах. Во всех случаях это ошибка программиста. Не ошибка в JavaScript.
две строки не содержат одинаковое количество и последовательность символов.
есть пробелы или новые строки до, внутри или после одной строки. Используйте оператор trim () на обоих и внимательно посмотрите на обе строки.
сюрприз типаж. Программист сравнивает несовместимые типы данных.
есть символы юникода, которые выглядят идентичными другим символам Юникода, но на самом деле являются разными символами Юникода.
UTF-8-сложная вещь. Кодировка имеет два различных кодов для символов, таких как á, é и т. д. Как вы уже видите в закодированной версии URL, шестнадцатеричные байты, из которых сделан символ, отличаются для обеих версий.
посмотреть этой ответа для получения дополнительной информации.
у меня была такая же проблема.
добавлять
<meta charset="UTF-8">
в HTML-файл Исправлена ошибка.
в моем случае механизм шаблонов выпекал строку json в HTML-файл. Эта строка в юникоде.
в то время как шаблон также был файлом unicode, JS engine обрабатывал строку, которую я написал в шаблон, как строку с кодировкой latin-1, пока я не добавил мета-тег.
я сравнивал введенную строку с одной из JSON предметы предметов (location.title == "Mühle"
)