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?

40
demandé sur Mark Amery 2009-10-06 03:18:27

7 réponses

string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))
38
répondu EToreo 2016-08-01 13:16:43

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 /

50
répondu Jaider 2016-09-28 15:22:50

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();
}
8
répondu paparazzo 2017-09-07 22:49:49

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 .

7
répondu Eric J. 2009-10-05 23:30:16

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.)

3
répondu rookie1024 2016-08-26 18:11:55

ç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.

1
répondu Jonas Elfström 2009-10-05 23:29:15
    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
répondu Ross Kelly 2016-06-08 01:43:25