5

我们有两个相同的字母 'ی' 和 'ي',第一个作为主字母出现在 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 );

输出:

-1       : None
-1       : IgnoreCase
-1       : IgnoreNonSpace
-1       : IgnoreSymbols
-1       : IgnoreKanaType
-1       : IgnoreWidth
1        : OrdinalIgnoreCase
-1       : StringSort
130      : Ordinal
4

3 回答 3

6

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

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

这将为IgnoreCase和输出 1 OrdinalIgnoreCase

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

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

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

于 2013-02-20T15:41:29.683 回答
0

这里我的代码字符阿拉伯文“ي,ك”到波斯文“ی,ک”,通过扩展方法:

 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;
    }
于 2017-10-24T07:39:54.793 回答
0
public string ToFaText(string strTxt)
{
    return strTxt.Replace("ك","ک").Replace("ي","ی");
}

用法:

        string str="اولين برداشت";
        string per = ToFaText(str);
于 2020-06-08T09:57:33.897 回答