2009-10-05 17 views
37

Ho una routine C# che importa i dati da un file CSV, li confronta con un database e quindi li riscrive in un file. Il file sorgente sembra avere alcuni caratteri non ASCII che stanno ostacolando la routine di elaborazione.Rimuovi tutti i caratteri non ASCII dalla stringa

Ho già un metodo statico che eseguo ogni campo di input ma esegue controlli di base come la rimozione di virgole e virgolette. Qualcuno sa come posso aggiungere funzionalità che rimuova anche i caratteri non ASCII?

risposta

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

Importante notare che l'uso di asciiencoding sostituirà tutti i caratteri non ascii con '?' (63), che può o non può essere quello che si desidera o che si aspetta . – captncraig

+11

inoltre, è possibile verificare se contiene solo ASCII, se 's == sOut' – Jaider

1

Sembra strano che sia stato accettato di rilasciare il non-ASCII.

Inoltre, consiglio sempre l'eccellente libreria FileHelpers per l'analisi dei file CSV.

+0

+1 Per il collegamento FileHelpers! Sembra molto utile – amelvin

7

Se si voleva mettere alla prova un carattere specifico, è possibile utilizzare

if ((int)myChar <= 127) 

Basta ottenere la codifica ASCII della stringa non vi dico che un carattere specifico era non-ASCII per cominciare (se vi interessa a tale proposito). Vedi MSDN.

48

Ecco una soluzione semplice:

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

fonte: http://snipplr.com/view/35806/

+2

Questa soluzione ha il vantaggio di lavorare in librerie di classi portatili, dove Encoding.ASCII non è disponibile. –

+2

Ha anche il vantaggio di essere molto più veloce della soluzione accettata perché non ha bisogno di creare effettivamente una stringa codificata. –

+1

-1; la domanda ha chiesto "funzionalità che rimuove i caratteri non ASCII", cosa che questo non fa. Il * titolo * era ambiguo, ma la soluzione è chiarire il titolo (che ho fatto), non rispondere a una domanda che l'OP non ha chiesto. Questa potrebbe essere una buona risposta a una domanda diversa da quella che hai pubblicato, ma è una non risposta a quella che hai fatto. –

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

fare tutto in una volta

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

Ecco un miglioramento sulla risposta accettata:

string fallbackStr = ""; 

Encoding enc = Encoding.GetEncoding(Encoding.ASCII.CodePage, 
    new EncoderReplacementFallback(fallbackStr), 
    new DecoderReplacementFallback(fallbackStr)); 

string cleanStr = enc.GetString(enc.GetBytes(inputStr)); 

Questo metodo sostituirà i caratteri sconosciuti con il valore di fallbackStr oppure se fallbackStr è vuoto, lasciarli fuori completamente. (Si noti che può essere definito al di fuori dell'ambito di una funzione.)

Problemi correlati