2012-01-18 64 views
3

是否有“.net方式”可以将字符转换为: úüãá?açéêíõóôáéíñóú¿¿ 对于类似的非重音字母。将角色转换为友好的url的方法?

eg.ú到u

我的问题就像是一个预文本: Handling SEO Friendly URL with Non-English Characters

如果不是这样,我想我可以永远是对的一个发现&替换功能。

+0

你确定这些字符不是搜索引擎友好? – ivowiblo 2012-01-18 21:04:45

+0

可能的重复[如何从.NET中的字符串中删除变音符(重音符号)?](http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-字符串中网) – 2012-01-18 21:10:06

回答

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

在这里,我们已经为上述问题的情况下,这只是忽略它们默认的另一个例子。我们还分割了一个字符串来生成字符的枚举,所以我们不必浪费在没有必要对结果进行字符串操作的情况下(比如说我们要写下字符来输出下一个字符,或者再做一些字符由字符操作)。

一个例子情况下的东西,我们希望也转换L和L以L和L,但没有其他专门的担忧可以使用:

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