[英]Same Chinese text not passing equality test
我正在使用以下两个中文字符串执行测试:
中國哲學書電子化計劃
...和...
中國哲學書電子化計劃
它们看起来完全相同,但事实并非完全相同。 在立即窗口中执行以下测试:
"中國哲學書電子化計劃" == "中國哲學書電子化計劃"
false
"中國哲學書電子化計劃".Length + " " + "中國哲學書電子化計劃".Length
"12 10"
也:
"中國哲學書電子化計劃"[0]
8206 ''
"中國哲學書電子化計劃"[0]
20013 '中'
我认为这可能与代理对有关,但我不知道为什么会发生这种情况。 我感到很奇怪,您可以使用不同的二进制表示形式来表示完全相同的中文文本。 谁能解释这个现象?
您在其中有控制字符,因此在比较它们时需要使用InvariantCulture参数。
看这个例子:
var str1 = "中國哲學書電子化計劃";
var str2 = "中國哲學書電子化計劃";
Console.WriteLine("str1 == str2 -> {0}", str1 == str2);
Console.WriteLine("str1 == str2 -> {0}", str1.Equals(str2,StringComparison.InvariantCulture));
将为您提供以下输出:
str1 == str2 -> False
str1 == str2 -> True
如此处另一个好的答案所指出的那样,代码8206是从左到右的标记。 可以在此处找到更多信息。
InvariantCulture比较不考虑此类控制代码。 可以在此处找到更多信息。 相反,序数比较(默认)在字节级别进行。
如果要从任何控制字符中“清理”字符串,则无需遍历每个字符,相反,ReGex会助您一臂之力,如下所示:
var cleanString = Regex.Replace(dirtyString, @"\p{C}+", string.Empty);
十进制代码8206的字符为U + 200E LEFT-TO-RIGHT MARK,并且在第一个字符串的开头有该字符的两个副本。 这解释了结果。
您应该做什么取决于数据来自什么以及将如何处理。 这样的U + 200E不会造成伤害,在某些情况下可能会造成伤害,但很有可能在这里不是故意的。 如果这些字符可能出现在数据中,则应询问那里还有哪些其他控制字符以及应如何处理。 删除它们可能比较合适,或者您可能需要以忽略它们的方式进行比较(例如,在内部构造字符串副本并删除控制字符,然后进行比较)。
此特定问题与代理对无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.