2009-10-05 132 views
37

我有一個C#例程,它從CSV文件導入數據,將其與數據庫相匹配,然後將其重寫爲文件。源文件似乎有一些非ASCII字符會污染處理例程。刪除字符串中的所有非ASCII字符

我已經有一個靜態方法,我運行每個輸入字段,但它執行基本檢查,如刪除逗號和引號。有人知道我可以添加刪除非ASCII字符的功能嗎?

回答

35
string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s)) 
+9

需要注意的是,使用asciiencoding將用'?'(63)替換所有非ascii字符,這可能是也可能不是您想要的或期望的。 – captncraig

+11

此外,您可以檢查它是否僅包含ASCII,如果s == sOut' – Jaider

1

聽起來有點奇怪,它被接受放棄非ASCII。

此外,我總是建議優秀的FileHelpers庫解析CSV文件。

+0

+1對於FileHelpers鏈接!看起來非常有用。 – amelvin

7

如果你想測試一個特定的字符,你可以使用

if ((int)myChar <= 127) 

剛開字符串的ASCII編碼不會告訴你的是一個特定的字符是非ASCII開始與(如果你關心關於那個)。見MSDN

48

這裏一個簡單的解決方案:

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/

+2

此解決方案可用於Encoding.ASCII不可用的便攜式類庫中。 –

+2

它也比被接受的解決方案快得多,因爲它不需要實際創建編碼字符串。 –

+1

-1;該問題被要求提供「刪除非ASCII字符的功能」,這是不行的。 *標題*不明確,但解決方案是澄清標題(我已經完成),而不是回答OP沒有提出的問題。這可能是對你發佈的問題以外的其他問題的一個很好的答案,但是對你所做的那個問題沒有回答。 –

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

就做一次全部

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

這裏的所接受的答案的改進:

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可以在函數範圍外定義。)

相關問題