字符串部分比较

alp*_*use 10 .net c# string comparison

可能重复:
为什么string.Compare似乎不一致地处理重音字符?

我有以下代码

var s1 = "ABzzzzz2";
var s2 = "äbzzzzz1";

var cmp = StringComparison.InvariantCultureIgnoreCase;

Console.WriteLine(string.Compare(s1, 0, s2, 0, 7, cmp)); //prints -1
Console.WriteLine(string.Compare(s1, 0, s2, 0, 8, cmp)); //prints 1
Run Code Online (Sandbox Code Playgroud)

怎么可能是第一个字符串的一部分小于第二个字符串的一部分,而整个第一个字符串大于整个第二个字符串?
我在x64,.net 2.0,3.5,4.0上测试过它

小智 1

我的理论是该算法首先对字符串进行标准化,然后进行比较。根据这个“\xc3\xa4bzzzzz1”标准化为“abzzzzz1”。规范化形式的第一次比较结果相等,但返回 0 会不正确,因为实际字符串不相等。因此它恢复为序数比较并且结果为-1。

\n\n

在第二种情况下,标准化后,显然“abzzzzz2”大于“abzzzzz1”,因此结果为 1。

\n\n

这种方法还解释了这个问题中提到的情况\n有关规范化的详细信息,请查看MSDN 页面

\n