【问题标题】:Why does OrdinalIgnoreCase and InvariantCultureIgnoreCase return different results?为什么 OrdinalIgnoreCase 和 InvariantCultureIgnoreCase 返回不同的结果?
【发布时间】:2013-03-13 00:23:34
【问题描述】:

我认为StringComparison.OrdinalIgnoreCaseStringComparison.InvariantCultureIgnoreCase 在处理纯英文字符串时做同样的工作。但是,我正在处理的以下代码并非如此:

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

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

有什么特别的原因吗?

【问题讨论】:

标签: c# string-comparison


【解决方案1】:
"‎877495169fa05b9d8639a0ebc42022338f7d2324"

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

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

"877495169fa05b9d8639a0ebc42022338f7d2324"

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

【讨论】:

  • 很好看。在我的 Notepad++ 中,它显示为一个问号:"?877495169fa05b9d8639a0ebc42022338f7d2324"
  • 谢谢!这不是一个技巧问题,我实际上将此字符串作为证书的指纹从 certmgr.msc 复制到了我的程序中,但比较失败了。我不知道它可以包含隐形字符。结果 Visual Studio 也没有显示这些字符。很好玩!
  • 好吧,这更有意义。记录在案:什么语言版本的 Windows 产生了这个?
  • Windows 8 Enterprise en-US。
猜你喜欢
  • 2018-05-20
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2013-03-10
  • 1970-01-01
相关资源
最近更新 更多