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

Tod*_* Li 10 c# string-comparison

当涉及到仅限英语的字符串时,我想StringComparison.OrdinalIgnoreCaseStringComparison.InvariantCultureIgnoreCase做同样的工作.但是,我正在使用以下代码中的情况并非如此:

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

// Returns -1
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","?877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

有什么特别的原因吗?

Han*_*ant 25

"?877495169fa05b9d8639a0ebc42022338f7d2324"
Run Code Online (Sandbox Code Playgroud)

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

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

"877495169fa05b9d8639a0ebc42022338f7d2324"
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!这不是一个技巧问题,我实际上将此字符串作为证书的指纹从certmgr.msc复制到我的程序,并且无法进行比较.我不知道可能包含隐形字符.事实证明,Visual Studio也不会显示这些字符.很好玩! (3认同)