关于C#:为什么ordinalAlignoreCase和invarialCultureEignoreCase返回不同的结果?

Why does OrdinalIgnoreCase and InvariantCultureIgnoreCase return different results?

我以为只有英文字符串的时候,StringComparison.OrdinalIgnoreCaseStringComparison.InvariantCultureIgnoreCase也做同样的工作。但是,我正在研究的代码不是这样的:

1
2
3
4
5
// Returns 0
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","?877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.InvariantCultureIgnoreCase)

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

有什么特别的原因吗?


1
"?877495169fa05b9d8639a0ebc42022338f7d2324"

听起来像个骗人的问题。在这个字符串的开头有一个额外的字符,在第一个数字8之前。它在浏览器中不可见。它是U+200E,"从左到右标记"。序数比较可以看到该字符,而不变比较则忽略它。您可以通过在字符串上使用tochararray()自己看到它。

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

1
"877495169fa05b9d8639a0ebc42022338f7d2324"

而compare()方法现在像应该的那样返回0。注意你现在使用的文本编辑器或输入法。Unicode不是很有趣吗?