web-dev-qa-db-fra.com

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 #)

208
philcruz
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
392
philcruz

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

Cela peut paraître fastidieux, mais cela devrait être intuitif. Il utilise le codage .NET ASCII pour convertir une chaîne. UTF8 est utilisé lors de la conversion car il peut représenter n’importe quel des caractères originaux. Il utilise EncoderReplacementFallback pour convertir tout caractère non-ASCII en chaîne vide.

113
bzlm

Je crois que MonsCamus voulait dire:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
36
Josh

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

14
sinelaw

Inspiré par la solution d'expressions régulières 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 du code non testé.

9
Bent Rasmussen

pas besoin de regex. juste utiliser l'encodage ...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
5
rjp

La plage légèrement modifiée suivante m'a été utile pour analyser des blocs de commentaires dans une base de données. Cela signifie que vous n'aurez pas à vous débattre avec les caractères de tabulation et d'échappement qui pourraient perturber le fonctionnement d'un champ CSV.

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

Si vous voulez éviter d’autres caractères spéciaux ou un contrôle de ponctuation particulier la table ascii

4
MonsCamus

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

Il trouve et supprime les caractères non-ASCII (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 travail de violon pour le code

Remplacez le codage selon l'exigence, le repos doit rester le même.

3
Polynomial Proton

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

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
Jeppe Stig Nielsen

J'utilise cette expression régulière pour filtrer les caractères incorrects 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.

1
user890332

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
Anonymous coward