10

当涉及到纯英语字符串时,我想StringComparison.OrdinalIgnoreCase并做了同样的工作。StringComparison.InvariantCultureIgnoreCase但是,我正在处理的以下代码并非如此:

// Returns 0
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","‎877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.InvariantCultureIgnoreCase)

// Returns -1
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","‎877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.OrdinalIgnoreCase)

有什么特别的原因吗?

4

1 回答 1

25
"‎877495169fa05b9d8639a0ebc42022338f7d2324"

听起来像个技巧问题。此字符串的开头有一个额外的字符,在第一个数字 8 之前。它在浏览器中不可见。它是 U+200E,“从左到右标记”。序数比较看到那个字符,不变比较忽略它。您可以通过在字符串上使用 ToCharArray() 自己查看它。

删除该字符串并粘贴此字符串,我从中删除了 U+200E:

"877495169fa05b9d8639a0ebc42022338f7d2324"

并且 Compare() 方法现在返回 0 就像它应该的那样。请注意您现在正在使用的文本编辑器或 IME。Unicode 不是很有趣吗?

于 2013-03-23T01:49:24.377 回答