为什么比较两个相等的波斯单词不返回0
本文关键字:单词不 返回 比较 两个 为什么 | 更新日期: 2023-09-27 18:00:13
我们有两个相同的字母"ی"answers"ي",第一个是在windows7之后作为主字母出现的
回到旧的XP,我们有第二个作为主要
现在,如果一个客户端在windowsXP上,另一个在windows7上,我得到的输入被确定为不同
我也尝试过使用波斯文化,但没有成功
我遗漏了什么吗
编辑:为了更好地理解,不得不更改单词。。现在它们看起来很相似
foreach (CompareOptions i in Enum.GetValues(new CompareOptions().GetType()).OfType<CompareOptions>())
Console.WriteLine( string.Compare("محسنين", "محسنین", new CultureInfo("fa-ir"), i) + "'t : " + i );
输出:
-1 : None
-1 : IgnoreCase
-1 : IgnoreNonSpace
-1 : IgnoreSymbols
-1 : IgnoreKanaType
-1 : IgnoreWidth
1 : OrdinalIgnoreCase
-1 : StringSort
130 : Ordinal
这两个字符串不相等。最后一个字母不同。
关于为什么IgnoreCase
返回-1但OrdinalIgnoreCase
返回1:
OrdinalIgnoreCase
使用不变区域性将字符串转换为上限,然后逐字节进行比较IgnoreCase
使用指定的区域性执行不区分大小写的比较
不同之处在于,IgnoreCase
对特定语言字母的差异了解"更多",并可能与不变文化不同地对待它们,从而导致不同的结果
这是后来被称为"土耳其问题"的不同表现。
你可以通过使用不变量文化而不是波斯文化来验证它:
foreach (CompareOptions i in Enum.GetValues(new CompareOptions().GetType()).OfType<CompareOptions>())
Console.WriteLine( string.Compare("محسنی", "محسني", CultureInfo.InvariantCulture, i) + "'t : " + i );
这将为IgnoreCase
和OrdinalIgnoreCase
输出1。
关于您编辑的问题:
这两个字符串仍然不同。以下代码输出字符串中单个字符的值。
foreach(var value in strings.Select(x => x.ToCharArray().Select(y => (int)y)))
Console.WriteLine(value);
结果如下:
1605
1581
1587
1606
1610 // <-- "yeh": ي
1606
1605
1581
1587
1606
1740 // <-- "farsi yeh": ی
1606
正如您所看到的,有一个字符不同,从而导致将这两个字符串视为不相等的比较。
这里我的代码字符阿拉伯"ي,ك"到波斯语"ی,ک",通过扩展方法:
private static readonly string[] pn = { "ی", "ک" };
private static readonly string[] ar = { "ي", "ك" };
public static string ToFaText(this string strTxt)
{
string chash = strTxt;
for (int i = 0; i < 2; i++)
chash = chash.Replace(ar[i],pn[i]);
return chash;
}
public string ToFaText(string strTxt)
{
return strTxt.Replace("ك","ک").Replace("ي","ی");
}
用法:
string str="اولين برداشت";
string per = ToFaText(str);