539 votes

Comment puis-je supprimer les signes diacritiques (accents) à partir d'une chaîne .NET?

Je suis en train de convertir certaines chaînes qui sont en français Canadien et en gros, je voudrais être en mesure de prendre l'accent français des marques dans les lettres tout en gardant la lettre. (E. g. convertir é de e.)

Quelle est la meilleure méthode pour atteindre cet objectif?

641voto

Blair Conrad Points 56195

Je n'ai pas utilisé cette méthode, mais Michael Kaplan décrit une méthode pour le faire dans son blog (avec une confusion titre) qui parle de décapage des signes diacritiques: le Décapage est un travail intéressant (aka Sur le sens du sens, aka Tous Mn caractères sont non-espacement, mais certains sont plus non-espacement de autres)

static string RemoveDiacritics(string text) 
{
    var normalizedString = text.Normalize(NormalizationForm.FormD);
    var stringBuilder = new StringBuilder();

    foreach (var c in normalizedString)
    {
        var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
        if (unicodeCategory != UnicodeCategory.NonSpacingMark)
        {
            stringBuilder.Append(c);
        }
    }

    return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}

Notez que c'est une suite à son précédent post: le Décapage des signes diacritiques....

L'approche utilise la Chaîne.Normaliser pour diviser la chaîne d'entrée en constituant des glyphes (essentiellement la séparation de la "base", les personnages de la diacritiques), puis scanne le résultat et ne retient que les caractères de base. C'est juste un peu compliqué, mais en réalité vous êtes à la recherche à un problème compliqué.

Bien sûr, si vous êtes de te limiter à la française, vous pouvez probablement vous en sortir avec le simple tableau d'une approche axée sur la Façon de supprimer les accents et tilde en C++ std::string, comme recommandé par @David Dibben.

237voto

azrafe7 Points 281

cela a fait l'affaire pour moi...

string accentedStr;
byte[] tempBytes;
tempBytes = System.Text.Encoding.GetEncoding("ISO-8859-8").GetBytes(accentedStr);
string asciiStr = System.Text.Encoding.UTF8.GetString(tempBytes);

rapide et court!

36voto

Luk Points 2602

Dans le cas où quelqu'un est intéressé, je cherchais quelque chose de semblable et a terminé l'écriture du suivant:

    public static string NormalizeStringForUrl(string name)
    {
        String normalizedString = name.Normalize(NormalizationForm.FormD);
        StringBuilder stringBuilder = new StringBuilder();

        foreach (char c in normalizedString)
        {
            switch (CharUnicodeInfo.GetUnicodeCategory(c))
            {
                case UnicodeCategory.LowercaseLetter:
                case UnicodeCategory.UppercaseLetter:
                case UnicodeCategory.DecimalDigitNumber:
                    stringBuilder.Append(c);
                    break;
                case UnicodeCategory.SpaceSeparator:
                case UnicodeCategory.ConnectorPunctuation:
                case UnicodeCategory.DashPunctuation:
                    stringBuilder.Append('_');
                    break;
            }
        }
        string result = stringBuilder.ToString();
        return String.Join("_", result.Split(new char[] { '_' }
            , StringSplitOptions.RemoveEmptyEntries)); // remove duplicate underscores
    }

15voto

KenE Points 1461

Dans le cas où ça intéresse quelqu'un, voici le java équivalent:

import java.text.Normalizer;

public class MyClass
{
    public static String removeDiacritics(String input)
    {
        String nrml = Normalizer.normalize(input, Normalizer.Form.NFD);
        StringBuilder stripped = new StringBuilder();
        for (int i=0;i<nrml.length();++i)
        {
            if (Character.getType(nrml.charAt(i)) != Character.NON_SPACING_MARK)
            {
                stripped.append(nrml.charAt(i));
            }
        }
        return stripped.toString();
    }
}

11voto

Greg Hewgill Points 356191

Je ne sais pas vraiment ce que votre situation est, mais je vous encourage fortement à ne pas le faire. Une bonne référence est Joël article Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères (Pas d'Excuses!).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X