簡體   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