Сравнение строк 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.

  1. две строки не содержат одинаковое количество и последовательность символов.

  2. есть пробелы или новые строки до, внутри или после одной строки. Используйте оператор trim () на обоих и внимательно посмотрите на обе строки.

  3. сюрприз типаж. Программист сравнивает несовместимые типы данных.

  4. есть символы юникода, которые выглядят идентичными другим символам Юникода, но на самом деле являются разными символами Юникода.


UTF-8-сложная вещь. Кодировка имеет два различных кодов для символов, таких как á, é и т. д. Как вы уже видите в закодированной версии URL, шестнадцатеричные байты, из которых сделан символ, отличаются для обеих версий.

посмотреть этой ответа для получения дополнительной информации.


у меня была такая же проблема.

добавлять

<meta charset="UTF-8">

в HTML-файл Исправлена ошибка.

в моем случае механизм шаблонов выпекал строку json в HTML-файл. Эта строка в юникоде.

в то время как шаблон также был файлом unicode, JS engine обрабатывал строку, которую я написал в шаблон, как строку с кодировкой latin-1, пока я не добавил мета-тег.

я сравнивал введенную строку с одной из JSON предметы предметов (location.title == "Mühle")