将重音字符转换为友好网址的方法?

时间:2012-01-18 20:58:38

标签: c# .net character-encoding special-characters iso

是否有转换字符的“.net方式”: úüãáâàçéêíõóôáéíñóúü¿ 对于类似的非重音字母。

eg.útou

我的问题就像是一篇前文: Handling SEO Friendly URL with Non-English Characters

如果没有,我想我总是可以找到&替换功能。

2 个答案:

答案 0 :(得分:3)

See this post from Michael 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));
    }

答案 1 :(得分:0)

这是前一个/类似问题的另一个例子

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);
}

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

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

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