5

比较“î”

string.Compare("î", "I ", StringComparison.CurrentCulture) -- returns -1
string.Compare("î", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1
string.Compare("î", "I", StringComparison.CurrentCulture) -- returns 1 (unexpected)
string.Compare("î", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 1  (unexpected)

用“我”

string.Compare("i", "I ", StringComparison.CurrentCulture) -- returns -1
string.Compare("i", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1
string.Compare("i", "I", StringComparison.CurrentCulture) -- returns -1
string.Compare("i", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 0

当前的文化是en-GB。我希望所有这些都返回 1。为什么更长的字符串会改变排序顺序?

4

4 回答 4

9

有关完整详细信息,请参阅UTS#10:Unicode 排序算法

特别是,请参阅解释此行为的第1.1 节多级比较。

那里有一张表格,其中显示了一些示例,例如:

role < rôle < roles

这类似于您使用 "I" 、 "î" 和 "I " 的示例,即:

"I" < "î" < "I "

除了最后roles有一个s,你的例子最后有一个空格。但同样的逻辑也适用;额外字符是什么无关紧要 - 有一个额外字符的简单事实使它在“î”之后排序。

规范中的一个关键点是:

如果基本字母不同,则通常会忽略重音差异。

如果长度不同,则基本字母会有所不同,因此在您的示例中忽略重音差异,末尾有空格。

但是,在字符串长度相同的情况下,不会忽略重音差异 - 这正是您所看到的结果。

于 2013-05-17T11:36:19.403 回答
2

文档

当发现不等式或已比较两个字符串时,比较终止。但是,如果两个字符串比较等于一个字符串的结尾,而另一个字符串有剩余字符,则认为剩余字符的字符串更大。返回值是上次执行的比较的结果。

于 2013-05-17T11:07:23.873 回答
0

基本上是因为在对字符串长度进行排序时很重要

“a”小于“a”对吗?说得通。

于 2013-05-17T11:11:17.843 回答
-1

这种行为很奇怪,我会告诉你的,但鉴于此处隐含的国际背景,我不明白为什么不使用Ordinal比较。

欲了解更多信息,请阅读这篇文章

于 2013-05-17T11:27:12.777 回答