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

本文关键字:结果 返回 OrdinalIgnoreCase InvariantCultureIgnoreCase 为什么 | 更新日期: 2023-09-27 18:05:19

我认为StringComparison.OrdinalIgnoreCaseStringComparison.InvariantCultureIgnoreCase在处理纯英语字符串时做同样的工作。然而,在我正在处理的以下代码中,情况并非如此:

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

有什么特别的原因吗?

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

"‎877495169fa05b9d8639a0ebc42022338f7d2324"

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

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

"877495169fa05b9d8639a0ebc42022338f7d2324"

Compare()方法现在返回0。一定要注意你现在使用的文本编辑器或IME。Unicode不是很有趣吗?