第二个字符串更长时奇怪的字符串排序

Jon*_*Rea 5 c# sorting string

比较"î"

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)
Run Code Online (Sandbox Code Playgroud)

随着"我"

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
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*son 9

有关完整详细信息,请参阅UTS#10:Unicode归类算法.

特别是,请参见1.1多级比较,它解释了这种行为.

那里有一张表格,展示了一些例子,例如:

role < rôle < roles

这类似于"I","î"和"I"的例子,即:

"I" < "î" < "I "

除非roles有一个s底,你的例子有,在后面加上一个空格.但同样的逻辑适用; 这是无关紧要的多余的字符是什么-简单的事实,那就是一个多余的字符使得排序后"我".

该规范的一个关键点是:

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

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

但是,如果字符串的长度相同,则不会忽略重音差异- 这正是您所看到的结果.

  • 这个答案和那个页面就是为什么在处理文化敏感列表时没有人应该编写自己的文本排序/比较实现.当然,.NET实现中可能存在错误,但如果我自己编写,我会保证会有错误.好的答案,好问题! (2认同)