Comment puis-je supprimer les accents sur une chaîne?

Dupliquer possible:
Comment puis-je supprimer les diacritiques (accents) d’une chaîne dans .NET?

J’ai la chaîne suivante

áéíóú 

que j’ai besoin de le convertir en

 aeiou 

Comment puis-je y arriver? (Je n’ai pas besoin de comparer, j’ai besoin de la nouvelle chaîne pour sauvegarder)


Pas une copie de Comment supprimer les signes diacritiques (accents) d’une chaîne dans .NET? . La réponse acceptée ici n’explique rien et c’est pourquoi je l’ai “rouverte”.

Cela dépend des besoins. Pour la plupart des utilisations, normaliser sur NFD puis filtrer tous les caractères de combinaison suffiront. Dans certains cas, la normalisation sur NFKD est plus appropriée (si vous souhaitez également supprimer certaines distinctions supplémentaires entre les caractères).

Certaines autres distinctions ne seront pas sockets en compte, notamment les caractères latins caressés. Il n’existe pas non plus de solution claire non spécifique à la localisation («doit être considéré comme équivalent à l ou w?). Vous devrez peut-être personnaliser au-delà.

Il existe également des cas où NFD et NFKD ne fonctionnent pas exactement comme prévu pour permettre la cohérence entre les versions Unicode.

Par conséquent:

 public static IEnumerable RemoveDiacriticsEnum(ssortingng src, bool compatNorm, Func 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 RemoveDiacriticsEnum(ssortingng src, bool compatNorm) { return RemoveDiacritics(src, compatNorm, c => c); } public static ssortingng RemoveDiacritics(ssortingng src, bool compatNorm, Func customFolding) { SsortingngBuilder sb = new SsortingngBuilder(); foreach(char c in RemoveDiacriticsEnum(src, compatNorm, customFolding)) sb.Append(c); return sb.ToSsortingng(); } public static ssortingng RemoveDiacritics(ssortingng src, bool compatNorm) { return RemoveDiacritics(src, compatNorm, c => c); } 

Ici, nous avons un défaut pour les cas mentionnés ci-dessus, qui les ignore. Nous avons également dissocié la construction d’une chaîne de la génération de l’énumération de caractères. Nous n’avons donc pas besoin de gaspiller de ressources dans les cas où il n’est pas nécessaire de manipuler la chaîne du résultat (disons que nous allions écrire les caractères à afficher ensuite, ou par manipulation de caractères).

Voici un exemple de cas pour lequel nous voulions également convertir ł et Ł en l et L, mais n’avions aucune autre préoccupation spécialisée à utiliser:

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

L’utilisation de cette méthode avec les méthodes ci-dessus combinées permet d’éliminer le trait dans ce cas, ainsi que les signes diacritiques décomposables.

 public ssortingng RemoveDiacritics(ssortingng input) { ssortingng stFormD = input.Normalize(NormalizationForm.FormD); int len = stFormD.Length; SsortingngBuilder sb = new SsortingngBuilder(); 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)); }