如何删除字符串上的重音?

Bru*_*oLM 15 .net c#

可能重复:
如何从.NET中的字符串中删除变音符号(重音符号)?

我有以下字符串

áéíóú
Run Code Online (Sandbox Code Playgroud)

我需要将其转换为

aeiou
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现它?(我不需要比较,我需要新的字符串来保存)


不重复如何从.NET中的字符串中删除变音符号(重音符号)?.那里接受的答案没有解释任何事情,这就是为什么我"重新开启"它.

Jon*_*nna 23

这取决于要求.对于大多数用途,然后归一化为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);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们对上面提到的问题情况有一个默认值,它只是忽略它们.我们还从生成字符枚举中拆分构建字符串,因此在不需要对结果进行字符串操作的情况下我们不必浪费(比如说我们要将字符写入下一个输出,或者再做一些char -by-char操纵).

我们想要将ł和Ł转换为l和L,但没有其他特殊问题可以使用的示例:

private static char NormaliseLWithStroke(char c)
{
  switch(c)
  {
     case '?':
       return 'l';
     case '?':
       return 'L';
     default:
       return c;
  }
}
Run Code Online (Sandbox Code Playgroud)

与上述方法一起使用它将结合在一起除去中风,以及可分解的变音符号.

  • 您是否有机会将此答案移至引用的问题中? (2认同)

cic*_*chy 15

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));
}
Run Code Online (Sandbox Code Playgroud)