为什么OrdinalIgnoreCase和InvariantCultureIgnoreCase会返回不同的结果?

时间:2013-03-23 01:24:20

标签: c# string-comparison

我认为StringComparison.OrdinalIgnoreCaseStringComparison.InvariantCultureIgnoreCase在英语字符串方面做同样的工作。但是,我正在使用以下代码中的情况并非如此:

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

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

有什么特别的原因吗?

1 个答案:

答案 0 :(得分:25)

"‎877495169fa05b9d8639a0ebc42022338f7d2324"

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

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

"877495169fa05b9d8639a0ebc42022338f7d2324"

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