为什么比较两个相等的波斯单词不会返回0?

Moh*_*kar 5 .net c# vb.net culture cultureinfo

我们有两个相同的字母'ی'和'ي',第一个作为主要信件在Windows 7之后出现.
回到旧版XP,我们将第二个作为主要版本.
现在,如果一个客户端在Windows XP上,另一个客户端在Windows 7上,我得到的输入被确定为不同.
我也尝试过使用波斯文化而没有成功.
我错过了什么吗?
编辑:不得不改变单词以便更好地理解..现在它们看起来很相似.

foreach (CompareOptions i in Enum.GetValues(new CompareOptions().GetType()).OfType<CompareOptions>()) 
    Console.WriteLine( string.Compare("??????", "??????", new CultureInfo("fa-ir"), i) + "\t : " + i );
Run Code Online (Sandbox Code Playgroud)

产出:

-1       : None
-1       : IgnoreCase
-1       : IgnoreNonSpace
-1       : IgnoreSymbols
-1       : IgnoreKanaType
-1       : IgnoreWidth
1        : OrdinalIgnoreCase
-1       : StringSort
130      : Ordinal
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 5

两个字符串相等.最后一个字母不同.

关于为什么IgnoreCase返回-1但OrdinalIgnoreCase返回1:

  • OrdinalIgnoreCase 使用不变文化将字符串转换为高位,然后执行逐字节比较
  • IgnoreCase 使用指定的区域性来执行不区分大小写的比较.

不同之处在于,IgnoreCase他们对指定语言的字母差异有了"更多"的认识,并且可能会对它们的处理方式与不变的文化不同,导致不同的结果.
这是所谓的"土耳其问题"的不同表现形式.

您可以使用InvariantCulture而不是Persian来自行验证:

foreach (CompareOptions i in Enum.GetValues(new CompareOptions().GetType()).OfType<CompareOptions>()) 
    Console.WriteLine( string.Compare("?????", "?????", CultureInfo.InvariantCulture, i) + "\t : " + i );
Run Code Online (Sandbox Code Playgroud)

这将输出1两IgnoreCaseOrdinalIgnoreCase.

关于您编辑的问题:
两个字符串仍然不同.以下代码输出字符串中单个字符的值.

foreach(var value in strings.Select(x => x.ToCharArray().Select(y => (int)y)))
    Console.WriteLine(value);
Run Code Online (Sandbox Code Playgroud)

结果将如下所示:

1605
1581
1587
1606
1610 // <-- "yeh": ?
1606

1605
1581
1587
1606
1740 // <-- "farsi yeh": ?
1606
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个字符不同,导致比较将这两个字符串视为不相等.