我在比较两个字符串时遇到了一个奇怪的问题。这是我的代码:
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,但就我而言,x
和y
来自同一个来源,并且编码相同。
答案 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/