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

C# 为什么OrdinalIgnoreCase和InvariantCultureIgnoreCase返回不同的结果?,c#,string-comparison,C#,String Comparison,我认为StringComparison.ordinallingorecase和StringComparison.invariantCultureInogoreCase在纯英语字符串方面做同样的工作。但是,我正在编写的以下代码并非如此: // Returns 0 string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","‎877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison

我认为
StringComparison.ordinallingorecase
StringComparison.invariantCultureInogoreCase
在纯英语字符串方面做同样的工作。但是,我正在编写的以下代码并非如此:

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

// Returns -1
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","‎877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.OrdinalIgnoreCase)
有什么特别的原因吗

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

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

"877495169fa05b9d8639a0ebc42022338f7d2324"

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

可能重复@DanielA.White这个问题肯定不是那个问题的重复。我想你没读过这本书。很好地发现了。在我的记事本++中,它显示为一个问号:
“?877495169fa05b9d8639a0ebc42022338f7d2324”
。谢谢!这不是一个骗人的问题,我实际上将这个字符串作为证书的指纹从certmgr.msc复制到了我的程序中,但比较失败。我不知道它可能包含看不见的字符。事实证明,VisualStudio也没有显示这些角色。真有趣!好吧,这更有意义。请记录:是什么语言版本的Windows产生了这个?Windows 8 Enterprise en US。