Supprimer tous les caractères non-ASCII de la chaîne
j'ai une routine C# qui importe des données d'un fichier CSV, les compare à une base de données et les réécrit ensuite dans un fichier. Le fichier source semble avoir quelques caractères non-ASCII qui brouillent la routine de traitement.
j'ai déjà une méthode statique que j'exécute chaque champ d'entrée mais qui effectue des vérifications de base comme la suppression des virgules et des guillemets. Est-ce que quelqu'un sait comment je pourrais ajouter une fonctionnalité qui supprime aussi les caractères non ASCII?
7 réponses
string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))
Voici une solution simple:
public static bool IsASCII(this string value)
{
// ASCII encoding replaces non-ascii with question marks, so we use UTF8 to see if multi-byte sequences are there
return Encoding.UTF8.GetByteCount(value) == value.Length;
}
source: http://snipplr.com/view/35806 /
tout Faire à la fois
public string ReturnCleanASCII(string s)
{
StringBuilder sb = new StringBuilder(s.Length);
foreach(char c in s)
{
if((int)c > 127) // you probably don't want 127 either
continue;
if((int)c < 32) // I bet you don't want control characters
continue;
if(c == ',')
continue;
if(c == '"')
continue;
sb.Append(c);
}
return sb.ToString();
}
si vous voulez tester un caractère spécifique, vous pouvez utiliser
if ((int)myChar <= 127)
le fait de simplement obtenir l'encodage ASCII de la chaîne ne vous dira pas qu'un caractère spécifique était non-ASCII pour commencer (si vous vous souciez de cela). Voir MSDN .
voici une amélioration par rapport à la réponse acceptée:
string fallbackStr = "";
Encoding enc = Encoding.GetEncoding(Encoding.ASCII.CodePage,
new EncoderReplacementFallback(fallbackStr),
new DecoderReplacementFallback(fallbackStr));
string cleanStr = enc.GetString(enc.GetBytes(inputStr));
cette méthode remplacera les caractères inconnus par la valeur fallbackStr
, ou si fallbackStr
est vide, Laissez-les complètement. (Notez que enc
peut être défini en dehors de la portée d'une fonction.)
ça semble étrange qu'on accepte de laisser tomber les non-ASCII.
aussi je recommande toujours l'excellente FileHelpers bibliothèque pour l'analyse des fichiers CSV.
public string RunCharacterCheckASCII(string s)
{
string str = s;
bool is_find = false;
char ch;
int ich = 0;
try
{
char[] schar = str.ToCharArray();
for (int i = 0; i < schar.Length; i++)
{
ch = schar[i];
ich = (int)ch;
if (ich > 127) // not ascii or extended ascii
{
is_find = true;
schar[i] = '?';
}
}
if (is_find)
str = new string(schar);
}
catch (Exception ex)
{
}
return str;
}