2009-10-05 9 views
37

J'ai une routine C# qui importe des données à partir d'un fichier CSV, les met en correspondance avec une base de données, puis les réécrit dans un fichier. Le fichier source semble avoir quelques caractères non-ASCII qui bloquent la routine de traitement.Supprimer tous les caractères non-ASCII de la chaîne

J'ai déjà une méthode statique que j'exécute chaque champ d'entrée, mais il 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 les caractères non-ASCII aussi?

Répondre

35
string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s)) 
+9

Il est important de noter que l'utilisation de asciiencoding remplacera tous les caractères non-ascii par '?' (63), ce qui peut être ou ne pas être ce que vous voulez ou attendez . – captncraig

+11

En outre, vous pouvez vérifier s'il contient seulement ASCII, si 's == sOut' – Jaider

1

Il semble assez étrange qu'il soit accepté de supprimer le non-ASCII.

Aussi je recommande toujours l'excellente bibliothèque FileHelpers pour l'analyse des fichiers CSV.

+0

+1 Pour le lien FileHelpers! Ça a l'air très utile. – amelvin

7

Si vous voulez tester un caractère spécifique, vous pouvez utiliser

if ((int)myChar <= 127) 

Juste obtenir le codage ASCII de la chaîne ne vous dirai pas qu'un caractère spécifique était non-ASCII pour commencer (si vous vous souciez à propos de ça). Voir MSDN.

48

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/

+2

Cette solution a l'avantage de fonctionner dans les bibliothèques de classes portables, où Encoding.ASCII n'est pas disponible. –

+2

Il a aussi l'avantage d'être beaucoup plus rapide que la solution acceptée car il n'a pas besoin de créer une chaîne encodée. –

+1

-1; la question demandait "fonctionnalité qui supprime les caractères non ASCII", ce qui n'est pas le cas. Le * titre * était ambigu, mais la solution à cela est de clarifier le titre (ce que j'ai fait), pas de répondre à une question que le PO n'a pas posée. Cela pourrait être une bonne réponse à une question différente de celle sur laquelle vous l'avez posté, mais c'est une non-réponse à celle que vous avez faite. –

0
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; 
    } 
8

Est-ce que tout à 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(); 
} 
2

Voici une amélioration de 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 remplace les caractères inconnus par la valeur fallbackStr, ou si fallbackStr est vide, laissez-les entièrement. (Notez que peut être défini en dehors de la portée d'une fonction.)

Questions connexes