【问题标题】:Way to convert acented character to a url friendly one?将重音字符转换为 url 友好字符的方法?
【发布时间】:2012-01-18 20:58:37
【问题描述】:

是否有“.net 方式”来转换字符,例如: úüãáâàçéêíõóô áéíñóúü¿¡ 给一个类似的非重音字母。

eg.ú 给你

我的问题就像一个前提: Handling SEO Friendly URL with Non-English Characters

如果没有,我想我总是可以正确查找和替换功能。

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    这里我们为上面提到的问题情况设置了一个默认值,它只是忽略它们。我们还将构建字符串与生成字符枚举分开,因此在不需要对结果进行字符串操作的情况下,我们不必浪费(比如我们要编写字符以输出下一个,或者做一些进一步的字符-按字符操作)。

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 2014-06-25
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多