我正在使用以下两个中文字符串执行测试:
中國哲學書電子化計劃
...和...
中國哲學書電子化計劃
他们看起来完全相同,但他们不是。以下测试在立即窗口中执行:
"中國哲學書電子化計劃" == "中國哲學書電子化計劃"
false
"中國哲學書電子化計劃".Length + " " + "中國哲學書電子化計劃".Length
"12 10"
此外:
"中國哲學書電子化計劃"[0]
8206 ''
"中國哲學書電子化計劃"[0]
20013 '中'
我认为这可能与代理对有关,但我不明白为什么会这样。我发现很奇怪你可以使用不同的二进制表示法用中文表示完全相同的文本。有人可以解释这种现象吗?
答案 0 :(得分:4)
您有控制字符,因此在比较时需要使用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是左移标记。更多信息can be found here。
InvariantCulture比较忽略了这些控制代码。更多信息can be found here。相反,序数比较(默认值)在字节级别工作。
如果你想从任何控制角色'消毒'你的字符串,你不需要迭代每个角色,相反,ReGex会帮助你,就像这样:
var cleanString = Regex.Replace(dirtyString, @"\p{C}+", string.Empty);
答案 1 :(得分:3)
代码为8206的十进制字符是U + 200E LEFT-TO-RIGHT MARK,并且在第一个字符串的开头有两个该字符的副本。这解释了结果。
您应该做什么取决于数据来自何处以及将采取何种措施。 U + 200E本身不应该造成伤害,在某些情况下可能需要它,但可能性在这里是无意的。如果这些字符可能出现在数据中,您应该询问其他控制字符可能出现在那里以及应该如何处理它们。删除它们可能是合适的,或者您可能需要以忽略它们的方式进行比较(例如,在内部构造删除了控制字符的字符串副本,然后比较它们)。
此特定问题与代理对无关。