Comment pouvez-vous supprimer les caractères non-ASCII d'une chaîne? (en C #)
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)
)
);
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.
Je crois que MonsCamus voulait dire:
parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
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)
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é.
pas besoin de regex. juste utiliser l'encodage ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
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
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.
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.
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.
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, "");