比较unicode字符时,Javascript字符串比较失败

时间:2012-05-29 19:50:09

标签: javascript string unicode data-transfer unicode-normalization

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

JavaScript代码:

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

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

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

我将原来的jsfiddle分叉,使用slevithan建议的规范化lib来创建一个版本。链接:http://jsfiddle.net/GWZ8j/1/

5 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:5)

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

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

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

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

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

答案 2 :(得分:1)

UTF-8是一件复杂的事情。字符集有两个不同的字符代码,例如á,é等。正如您在URL编码版本中看到的那样,字符的HEX字节对于两个版本都不同。

有关详细信息,请参阅this答案。

答案 3 :(得分:0)

我遇到了同样的问题。

添加

<meta charset="UTF-8">

修复了HTML文件。

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

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

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

答案 4 :(得分: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)