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

StackOverflow https://stackoverflow.com/questions/123336

  •  02-07-2019
  •  | 
  •  

Question

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

Était-ce utile?

La solution

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

Autres conseils

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 sembler 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.

Je crois que MonsCamus voulait dire:

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

Si vous ne souhaitez pas effacer, mais convertir le latin accentué en caractères non accentués, jetez un coup d'œil à cette question: Comment puis-je traduire les caractères 8 bits en caractères 7 bits? (c'est-à-dire de Ü à U)

Inspiré par la solution Regular Expression 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();
}

Ceci est un code non testé.

pas besoin de regex. il suffit d'utiliser l'encodage ...

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

J'ai trouvé que la plage légèrement modifiée suivante était utile pour analyser les blocs de commentaires d'une base de données. Cela signifie que vous n'aurez pas à vous battre avec des caractères de tabulation et d'échappement qui pourraient perturber un champ CSV.

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

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

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 la solution de bzlm . Mais cela ne fonctionne que pour le code ASCII jusqu’à 127 (évidemment, vous pouvez remplacer le type de codage 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 ASCII étendus, c'est-à-dire jusqu'à 255 , qui est le ISO 8859-1

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

.

Remplacez le codage conformément à l'exigence, le repos doit rester identique.

Cela n’est pas optimal du point de vue des performances, mais plutôt d’une approche très simple: Linq:

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

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

J'ai utilisé cette expression rationnelle:

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top