如何将字符串放入文化不变的桶中?

时间:2013-06-30 16:43:15

标签: c# string invariantculture

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

我最初想过在.Net中使用CultureInvariant字符串比较,但是有两个问题:

  1. 实际上并不是说字母C与C cedilla相同,但我需要相等。

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

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

    感谢。

2 个答案:

答案 0 :(得分:0)

有一个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");
}

答案 1 :(得分:0)

这篇文章Is there String.Normalize() alternative in WinRT?有一个标记为答案的解决方案。我没有测试过,但是当我有这个时会在这里发表评论。