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)
两个字符串不相等.最后一个字母不同.
关于为什么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两IgnoreCase和OrdinalIgnoreCase.
关于您编辑的问题:
两个字符串仍然不同.以下代码输出字符串中单个字符的值.
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)
如您所见,有一个字符不同,导致比较将这两个字符串视为不相等.
| 归档时间: |
|
| 查看次数: |
923 次 |
| 最近记录: |