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#)
11 réponses
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
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.
Je crois que MonsCamus voulait dire:
parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
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)
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é.
Pas besoin de regex. suffit d'utiliser l'encodage...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
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
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.
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.
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, "");
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.