繁体   English   中英

相同中文文本未通过相等性测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM