我有一個C#例程,它從CSV文件導入數據,將其與數據庫相匹配,然後將其重寫爲文件。源文件似乎有一些非ASCII字符會污染處理例程。刪除字符串中的所有非ASCII字符
我已經有一個靜態方法,我運行每個輸入字段,但它執行基本檢查,如刪除逗號和引號。有人知道我可以添加刪除非ASCII字符的功能嗎?
我有一個C#例程,它從CSV文件導入數據,將其與數據庫相匹配,然後將其重寫爲文件。源文件似乎有一些非ASCII字符會污染處理例程。刪除字符串中的所有非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;
}
此解決方案可用於Encoding.ASCII不可用的便攜式類庫中。 –
它也比被接受的解決方案快得多,因爲它不需要實際創建編碼字符串。 –
-1;該問題被要求提供「刪除非ASCII字符的功能」,這是不行的。 *標題*不明確,但解決方案是澄清標題(我已經完成),而不是回答OP沒有提出的問題。這可能是對你發佈的問題以外的其他問題的一個很好的答案,但是對你所做的那個問題沒有回答。 –
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;
}
就做一次全部
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();
}
這裏的所接受的答案的改進:
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
可以在函數範圍外定義。)
需要注意的是,使用asciiencoding將用'?'(63)替換所有非ascii字符,這可能是也可能不是您想要的或期望的。 – captncraig
此外,您可以檢查它是否僅包含ASCII,如果s == sOut' – Jaider