Comment Pouvez-vous supprimer les caractères non-ASCII d'une chaîne? (en C#)

Comment Pouvez-vous supprimer les caractères non-ASCII d'une chaîne? (en C#)

192
demandé sur bzlm 2008-09-23 23:45:55

11 réponses

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
367
répondu philcruz 2016-08-18 03:51:59

Voici une solution. net pure qui n'utilise pas d'expressions régulières:

        string inputString = "Räksmörgås";
        string asAscii = Encoding.ASCII.GetString(
            Encoding.Convert(
                Encoding.UTF8,
                Encoding.GetEncoding(
                    Encoding.ASCII.EncodingName,
                    new EncoderReplacementFallback(string.Empty),
                    new DecoderExceptionFallback()
                    ),
                Encoding.UTF8.GetBytes(inputString)
            )
        );

Il peut sembler lourd, mais il devrait être intuitif. Il utilise l'encodage ASCII. Net pour convertir une chaîne. UTF8 est utilisé lors de la conversion car il peut représenter l'un des caractères d'origine. Il utilise un EncoderReplacementFallback to pour convertir tout caractère non-ASCII en une chaîne vide.

103
répondu bzlm 2008-09-25 20:05:22

Je crois que MonsCamus voulait dire:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
28
répondu Josh 2015-02-25 20:46:26

Si vous ne voulez pas dépouiller, mais convertir réellement le latin accentué en caractères non accentués, jetez un oeil à cette question: Comment traduire les caractères 8 bits en caractères 7 bits? (C'est-à-dire Ü À U)

14
répondu sinelaw 2017-05-23 12:26:23

Inspiré par la solution D'Expression régulière de philcruz , j'ai créé une solution LINQ pure

    public static string PureAscii(this string source, char nil = ' ')
    {
        var min = '\u0000';
        var max = '\u007F';
        return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
    }

    public static string ToText(this IEnumerable<char> source)
    {
        var buffer = new StringBuilder();
        foreach (var c in source)
            buffer.Append(c);
        return buffer.ToString();
    }

C'est un code non testé.

9
répondu Bent Rasmussen 2017-05-23 12:34:40

Pas besoin de regex. suffit d'utiliser l'encodage...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
5
répondu rjp 2013-06-18 17:56:45

J'ai trouvé la plage légèrement modifiée suivante utile pour analyser les blocs de commentaires d'une base de données, cela signifie que vous n'aurez pas à composer avec des caractères tab et escape qui perturberaient un champ CSV.

parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);

Si vous voulez éviter d'autres caractères spéciaux ou une ponctuation particulière, Vérifiez la table ascii

4
répondu MonsCamus 2012-10-01 10:02:56

Ce n'est pas une performance optimale, mais une approche Linq assez simple:

string strippedString = new string(
    yourString.Where(c => c <= sbyte.MaxValue).ToArray()
    );

L'inconvénient est que tous les caractères "survivants" sont d'abord placés dans un tableau de type char[] qui est ensuite jeté après que le constructeur string ne l'utilise plus.

2
répondu Jeppe Stig Nielsen 2013-09-03 17:08:42

Je suis venu ici à la recherche d'une solution pour les caractères ASCII étendus, mais je ne pouvais pas le trouver. Le plus proche que j'ai trouvé est la solution de bzlm . Mais cela ne fonctionne que pour le Code ASCII jusqu'à 127(évidemment, vous pouvez remplacer le type d'encodage dans son code, mais je pense que c'était un peu complexe à comprendre. Par conséquent, le partage de cette version). Voici une solution qui fonctionne pour codes ASCII étendus, c'est-à-dire jusqu'à 255 qui est le ISO 8859-1

Il trouve et supprime les caractères non-ascii(plus plus de 255)

Dim str1 as String= "â, ??î or ôu� n☁i✑++$-♓!‼⁉4⃣od;/'®;☕:☝)///1!@#"

Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1", 
                                                New EncoderReplacementFallback(String.empty),
                                                New DecoderReplacementFallback())

Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)

Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)

console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:

Voici un travailler violons pour le code

Remplacez l'encodage selon l'exigence, le repos devrait rester le même.

2
répondu TheUknown 2017-05-23 12:26:23

J'ai utilisé cette expression regex:

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");
1
répondu Anonymous coward 2012-06-12 12:27:20

J'utilise cette expression régulière pour filtrer les mauvais caractères dans un nom de fichier.

Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")

Cela devrait être tous les caractères autorisés pour les noms de fichiers.

0
répondu user890332 2017-06-09 18:17:02