2

我的应用程序需要处理可以包含重音字符的字符串。我需要能够将这些名称分组到不同字母的存储桶中。

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

  1. 它实际上不会说字母 C 与 C cedilla 相同,但我需要这种相等性。

  2. WinRT 的 .Net 版本在任何地方都没有 CultureInvariant 作为选项。

任何人都可以建议一种算法或至少一个起点,我可以用来尝试将不同的字母组合在一起吗?

谢谢。

4

2 回答 2

0

有一个代码(由 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 和带/不带重音的字母对其进行了测试,并且工作正常(即使使用撇号)。在任何情况下,您可能都必须使用基于字典的方法或一组条件/switch...case 来补充这一点,以考虑所有可能的可能性。例如:

if (inputString.Contains("ß"))
{
     inputString = inputString.Replace("ß", "ss");
}
于 2013-06-30T17:26:29.487 回答
0

这篇文章,WinRT 中有 String.Normalize() 替代方案吗?,有一个已标记为答案的解决方案。我还没有测试过,但是当我有的时候会在这里评论。

于 2013-06-30T17:48:09.747 回答