web-dev-qa-db-fra.com

Supprimer tous les caractères non-ASCII de la chaîne

J'ai une routine C # qui importe les données d'un fichier CSV, les compare à une base de données, puis les réécrit dans un fichier. Le fichier source semble contenir quelques caractères non-ASCII qui encrassent la routine de traitement. 

J'ai déjà une méthode statique à travers laquelle j'exécute chaque champ d'entrée, mais elle effectue des vérifications de base, telles que la suppression de virgules et de guillemets. Est-ce que quelqu'un sait comment je pourrais ajouter une fonctionnalité qui supprime également les caractères non-ASCII?

41
user135498
string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))
41
EToreo

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/

52
Jaider

Faire 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();
}
10
paparazzo

Si vous voulez tester un personnage spécifique, vous pouvez utiliser

if ((int)myChar <= 127)

Obtenir juste le codage ASCII de la chaîne ne vous dira pas qu'un caractère spécifique était non-ASCII pour commencer (si vous vous en souciez). Voir MSDN .

8
Eric J.

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, les omettra complètement. (Notez que enc peut être défini en dehors de la portée d'une fonction.)

3
rookie1024

Cela peut sembler étrange qu’il soit accepté d’abandonner le non-ASCII.

Aussi, je recommande toujours l'excellente FileHelpers library pour analyser les fichiers CSV.

2
Jonas Elfström
    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;
    }
0
Ross Kelly