我的应用程序需要处理可能包含重音符号的字符串。我需要能够将这些名称分为不同的字母桶。

我原本以为在.Net中使用CultureInvariant字符串比较,但是这样做有两个问题:


它实际上并不会说字母C与C cedilla相同,但是我需要这种相等性。
WinRT的.Net版本在任何地方都没有CultureInvariant作为选项。


谁能建议一个算法或至少一个我可以用来尝试将不同字母组合在一起的起点?

谢谢。

最佳答案

有一个code(由Michael S. Kaplan创建,并在很多文章中都提到了),可以解决大多数情况:

static string RemoveDiacritics(string stIn)
{
    string stFormD = stIn.Normalize(NormalizationForm.FormD);
    StringBuilder sb = new StringBuilder();

    for (int ich = 0; ich < stFormD.Length; ich++)
    {
        UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
        if (uc != UnicodeCategory.NonSpacingMark)
        {
            sb.Append(stFormD[ich]);
        }
    }

    return (sb.ToString().Normalize(NormalizationForm.FormC));
}


我用Ç/ C和带有/不带有重音符号的字母对其进行了测试,并且效果很好(即使使用撇号也可以)。无论如何,您可能必须使用基于字典的方法或一组条件/切换...案例来对此进行补充,以解决所有可能出现的情况。例如:

if (inputString.Contains("ß"))
{
     inputString = inputString.Replace("ß", "ss");
}

09-10 14:29