web-dev-qa-db-ja.com

文字列からすべての非ASCII文字を削除します

CSVファイルからデータをインポートし、データベースと照合してからファイルに書き換えるC#ルーチンがあります。ソースファイルには、処理ルーチンを汚染している非ASCII文字がいくつか含まれているようです。

各入力フィールドを実行する静的メソッドは既にありますが、コンマや引用符の削除などの基本的なチェックを実行します。非ASCII文字を削除する機能を追加する方法を知っている人はいますか?

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

ここで簡単な解決策:

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

ソース: http://snipplr.com/view/35806/

54
Jaider

一度に全部

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

特定のキャラクターをテストしたい場合は、使用できます

if ((int)myChar <= 127)

ASCII文字列のエンコーディングを取得するだけでは、特定の文字が最初は非ASCIIだったことはわかりません(気にする場合)。 [〜#〜]を参照してください。 msdn [〜#〜]

8
Eric J.

受け入れられた答えの改善点は次のとおりです。

string fallbackStr = "";

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

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

このメソッドは、不明な文字をfallbackStrの値で置き換えます。または、fallbackStrが空の場合は、それらを完全に除外します。 (encは関数のスコープ外で定義できることに注意してください。)

4
rookie1024

非ASCIIをドロップすることが受け入れられているのは、ちょっと奇妙に聞こえます。

また、CSVファイルの解析には、優れた FileHelpers ライブラリを常にお勧めします。

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