15

我想比较 JavaScript 中两个相同的字符串,但相等运算符==返回 false。一个字符串包含一个特殊字符(例如 danish å)。

JavaScript 代码:

var filenameFromJS = "Designhåndbog.pdf";
var filenameFromServer = "Designhåndbog.pdf";

print(filenameFromJS == filenameFromServer); // This prints false why?

对我有用的解决方案 是 slevthan 指出的 unicode 规范化。

我分叉了我原来的 jsfiddle 以使用 slevthan 建议的规范化库制作一个版本。链接:http: //jsfiddle.net/GWZ8j/1/

4

5 回答 5

13

与这里的其他人所说的不同,这与编码无关。相反,您的两个字符串使用不同的代码点来呈现相同的视觉字符。

要正确解决此问题,您需要在比较两个字符串之前对它们执行 Unicode 规范化。不幸的是,JavaScript 没有内置此功能。这是一个可以为您执行规范化的 JavaScript 库:https ://github.com/walling/unorm

于 2012-05-29T20:03:29.190 回答
6

JavaScript 相等运算符==在以下情况下似乎会失败。在所有情况下,它都是程序员错误。不是 JavaScript 中的错误。

  1. 这两个字符串不包含相同数量和序列的字符。

  2. 在一个字符串之前、之中或之后有空格或换行符。对两者都使用 trim() 运算符并仔细查看两个字符串。

  3. 惊喜类型转换。程序员正在比较不兼容的数据类型。

  4. 有些 unicode 字符看起来与其他 unicode 字符相同,但实际上是不同的 unicode 字符。

于 2013-10-29T03:17:39.337 回答
1

UTF-8 是一个复杂的东西。字符集有两个不同的字符代码,例如 á、é 等。正如您在 URL 编码版本中已经看到的,两个版本的字符的 HEX 字节不同。

有关更多信息,请参阅答案。

于 2012-05-29T19:54:31.267 回答
0

我有同样的问题。

添加

<meta charset="UTF-8">

到 HTML 文件解决了这个问题。

在我的例子中,模板引擎将一个 json 字符串烘焙到 HTML 文件中。这个字符串是 unicode。

虽然模板也是一个 unicode 文件,但 JS 引擎将我写入模板的字符串视为 latin-1 编码字符串,直到我添加了元标记。

我正在将输入的字符串与其中一个 JSON 对象项 ( location.title == "Mühle")进行比较

于 2017-08-06T21:12:44.530 回答
0

让浏览器为您标准化 unicode。这种方法对我有用:

function normalizeUnicode(s) {
    let div = $('<div style="display: none"></div>').html(s).appendTo('body');
    let res = div.html();
    div.remove();
    return res;
}

normalizeUnicode(unicodeVal1) == normalizeUnicode(unicodeVal2)
于 2021-08-11T14:53:55.117 回答