Способ преобразовать символ с акцентом в удобный для URL-адреса?

Есть ли "способ .net" для преобразования таких символов, как: úüãáâààçéêíõóô áéíñóúü¿¡ В аналогичную букву без ударения.

eg.ú to u

Мой вопрос подобен предварительному тексту: обработка SEO-дружественного URL-адреса с не -английские символы

Если нет, я думаю, я всегда могу исправить функцию поиска и замены.


person aron    schedule 18.01.2012    source источник
comment
Вы уверены, что эти символы не оптимизированы для SEO?   -  person Ivo    schedule 19.01.2012
comment
возможный дубликат Как удалить диакритические знаки (акценты ) из строки в .NET?   -  person Chris Haas    schedule 19.01.2012


Ответы (2)


Посмотреть этот пост от Майкла Каплана

    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));
    }
person Chris Haas    schedule 18.01.2012

вот еще один пример из предыдущего/подобного вопроса

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

Здесь у нас есть значение по умолчанию для проблемных случаев, упомянутых выше, которое просто их игнорирует. Мы также отделили построение строки от генерации перечисления символов, поэтому нам не нужно быть расточительным в тех случаях, когда нет необходимости манипулировать строкой с результатом (скажем, мы собирались записать символы для вывода следующим или сделать некоторые дополнительные char посимвольная манипуляция).

Пример случая, когда мы хотели также преобразовать l и L в l и L, но не могли использовать другие специализированные задачи:

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