8

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

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

在控制台中,我有:

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

我猜我的字符串包含奇怪的字符,那么我应该如何比较它们呢?我在比较 unicode 字符时读到Javascript 字符串比较失败,但在我的情况下,x并且y来自相同的来源并具有相同的编码。

4

4 回答 4

6

字符串中的Ä可以表示为单个 UNICODE 字符(带有分音符号的拉丁大写字母 A,U+00C4),或由拉丁大写字母 A (U+0041)后跟组合分音符号 (U+ )组成的复合字符0308)变音符号。

字符串中可能还有任意数量的零宽度空格 (U+200B)以及其他“不可见”字符。

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

于 2013-05-28T19:33:46.640 回答
4

尝试转义您的两个字符串以查看其中的字符。在这种情况下(尽管 Frédéric 已经涵盖了可能的情况),因为您使用的是 PGP,因此您可能存在二进制不可打印字符。

escape(x);
escape(y);

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

于 2013-05-28T20:01:29.487 回答
1

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

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

打印“假”:)

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

于 2013-05-28T19:37:06.103 回答
0

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

于 2014-05-01T17:59:44.610 回答