代码之家  ›  专栏  ›  技术社区  ›  BrunoLM

如何删除字符串上的重音符号?[副本]

  •  15
  • BrunoLM  · 技术社区  · 14 年前

    可能重复:
    How do I remove diacritics (accents) from a string in .NET?

    áéíóú
    

    我需要把它转换成

    aeiou
    

    我怎样才能做到呢?(我不需要比较,我需要保存新字符串)


    不是复制品 如何从.NET中的字符串中删除音调符号(重音符号)?

    2 回复  |  直到 7 年前
        1
  •  23
  •   Jon Hanna    14 年前

    这取决于需求。对于大多数使用,然后归一化为NFD,然后过滤掉所有组合字符就可以了。在某些情况下,标准化为NFKD更合适(如果您还想消除字符之间的一些进一步区别)。

    其他一些区别不会被发现,特别是笔划拉丁字符。对于某些语言,也没有明确的非语言环境特定的方法(应该被认为等同于l或w?)因此,您可能需要定制超出这一点。

    也有一些情况下,NFD和NFKD不能像预期的那样工作,以允许Unicode版本之间的一致性。

    因此:

    public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm, Func<char, char> customFolding)
    {
        foreach(char c in src.Normalize(compatNorm ? NormalizationForm.FormKD : NormalizationForm.FormD))
        switch(CharUnicodeInfo.GetUnicodeCategory(c))
        {
          case UnicodeCategory.NonSpacingMark:
          case UnicodeCategory.SpacingCombiningMark:
          case UnicodeCategory.EnclosingMark:
            //do nothing
            break;
          default:
            yield return customFolding(c);
            break;
        }
    }
    public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm)
    {
      return RemoveDiacritics(src, compatNorm, c => c);
    }
    public static string RemoveDiacritics(string src, bool compatNorm, Func<char, char> customFolding)
    {
      StringBuilder sb = new StringBuilder();
      foreach(char c in RemoveDiacriticsEnum(src, compatNorm, customFolding))
        sb.Append(c);
      return sb.ToString();
    }
    public static string RemoveDiacritics(string src, bool compatNorm)
    {
      return RemoveDiacritics(src, compatNorm, c => c);
    }
    

    在这里,我们为上述问题案例提供了一个默认值,它只是忽略了它们。我们还将生成字符串与生成字符枚举分离开来,这样在不需要对结果进行字符串操作的情况下就不必浪费时间了(比如说,我们要编写下一个要输出的字符,或者进行进一步的逐字符操作)。

    例如,我们也想将and转换为l和l,但没有其他专门问题可以使用:

    private static char NormaliseLWithStroke(char c)
    {
      switch(c)
      {
         case 'ł':
           return 'l';
         case 'Ł':
           return 'L';
         default:
           return c;
      }
    }
    

    在这种情况下,与上述方法结合使用将删除笔划,以及可分解的音调符号。

        2
  •  16
  •   cichy    14 年前
    public string RemoveDiacritics(string input)
    {
        string stFormD = input.Normalize(NormalizationForm.FormD);
        int len = stFormD.Length;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++)
        {
            System.Globalization.UnicodeCategory uc = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(stFormD[i]);
            if (uc != System.Globalization.UnicodeCategory.NonSpacingMark)
            {
                sb.Append(stFormD[i]);
            }
        }
        return (sb.ToString().Normalize(NormalizationForm.FormC));
    }