当第二个字符串较长时,奇怪的字符串排序

本文关键字:字符串 排序 第二个 | 更新日期: 2023-09-27 18:14:18

比较"î"

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。为什么使用更长的字符串会改变排序顺序?

当第二个字符串较长时,奇怪的字符串排序

详细信息请参见UTS#10: Unicode排序算法。

具体来说,请参见1.1多级比较一节,该节解释了这种行为。

那里有一个表,上面显示了一些例子,比如:

role < rôle < roles

这与你的"I","î"answers"I"的例子类似,即:

"I" < "î" < "I "

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

规范中的关键点是:

如果基础字母不同,重音差异通常被忽略。

如果长度不同,则基础字母不同,因此在您的示例中,重音差异将被忽略,并在末尾使用空格。

然而,当字符串长度相同时,重音差异是而不是被忽略—这正是您所看到的结果。

来自文档

当发现不相等或两个字符串都已比较时,比较终止。但是,如果两个字符串比较起来等于一个字符串的结尾,而另一个字符串还有剩余字符,则认为剩余字符的字符串更大。返回值是最后一次比较的结果。

基本上是因为排序字符串的长度很重要

"a"小于"a"对吗?是有意义的。

行为很奇怪,我会告诉你,但我不明白为什么不使用Ordinal比较考虑到这里隐含的国际上下文。