为什么比较两个相等的波斯单词不返回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

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

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

关于为什么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 );

这将为IgnoreCaseOrdinalIgnoreCase输出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);