看似相同的字符串无法比较

时间:2013-05-28 19:22:52

标签: javascript string

我在比较两个字符串时遇到了一个奇怪的问题。这是我的代码:

console.log(x == y);
console.log("'" + x + "'=='" + y + "'");
console.log(typeof(x));
console.log(typeof(y));

在控制台中,我有:

false 
'1Ä4±'=='1Ä4±' 
string
string

我猜我的字符串包含奇怪的字符,所以我该如何比较它们呢? 我看了Javascript string comparison fails when comparing unicode characters,但就我而言,xy来自同一个来源,并且编码相同。

4 个答案:

答案 0 :(得分:6)

字符串中的Ä可以表示为单个UNICODE字符(Latin Capital Letter A With Diaeresis, U+00C4),也可以表示为由composite character后跟{{3}组成的Latin Capital Letter A (U+0041) diacritic。

您的字符串中可能还有任意数量的Combining Diaeresis (U+0308)以及其他“隐身”字符。

因此,两个字符串可能呈现相同,但实际上是不同的。

答案 1 :(得分:3)

尝试逃避你的两个字符串以查看其中的字符。在这种情况下(虽然Frédéric已经涵盖了可能的情况),因为你正在使用PGP,你可能会有一个二进制不可打印的字符。

escape(x);
escape(y);

在您的控制台中,您将能够检测到正在运行的字符。

答案 2 :(得分:1)

顺便说一句。在JS(复制粘贴)中尝试此代码:)

console.log("A" == "А");

打印“false”:)

比较字符串意味着比较字符代码。在某些字体中,不同的字符代码具有相同的“图片”,如“l”和“I”(首先是L,第二个是i)。在上面的例子中,第一个A是西里尔文,第二个是拉丁语。

答案 3 :(得分:0)

如果您尝试在c#中执行此操作,则可能需要对Normalization执行某些操作。 FormC vs FormD vs FormKC vs FormKD 参考:http://sharepoint.asia/two-exactly-same-strings-fail-while-comparison-in-c-net/