我想比较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/。
答案 0 :(得分:11)
与其他一些人所说的不同,这与编码无关。相反,您的两个字符串使用不同的代码点来呈现相同的可视字符。
要正确解决此问题,您需要在比较它们之前对两个字符串执行Unicode规范化。不幸的是,JavaScript没有内置此功能。这是一个可以为您执行规范化的JavaScript库:https://github.com/walling/unorm
答案 1 :(得分:5)
在以下情况下,JavaScript等于运算符==
似乎失败了。在所有情况下都是程序员错误。不是JavaScript中的错误。
这两个字符串不包含相同的数字和字符序列。
在一个字符串之前,之内或之后有空格或换行符。在两者上使用trim()运算符并仔细查看两个字符串。
惊喜类型转换。程序员正在比较不兼容的数据类型。
有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)