CSVファイルからデータをインポートし、データベースと照合してからファイルに書き換えるC#ルーチンがあります。ソースファイルには、処理ルーチンを汚染している非ASCII文字がいくつか含まれているようです。
各入力フィールドを実行する静的メソッドは既にありますが、コンマや引用符の削除などの基本的なチェックを実行します。非ASCII文字を削除する機能を追加する方法を知っている人はいますか?
string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))
ここで簡単な解決策:
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;
}
一度に全部
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();
}
特定のキャラクターをテストしたい場合は、使用できます
if ((int)myChar <= 127)
ASCII文字列のエンコーディングを取得するだけでは、特定の文字が最初は非ASCIIだったことはわかりません(気にする場合)。 [〜#〜]を参照してください。 msdn [〜#〜] 。
受け入れられた答えの改善点は次のとおりです。
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
は関数のスコープ外で定義できることに注意してください。)
非ASCIIをドロップすることが受け入れられているのは、ちょっと奇妙に聞こえます。
また、CSVファイルの解析には、優れた FileHelpers ライブラリを常にお勧めします。
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;
}