2009-10-05 47 views
37

Tôi có một thường trình C# nhập dữ liệu từ tệp CSV, khớp với dữ liệu trên cơ sở dữ liệu và sau đó ghi lại nó vào tệp. Tệp nguồn dường như có một vài ký tự không phải ASCII đang làm hỏng quy trình xử lý.Xóa tất cả các ký tự không phải ASCII khỏi chuỗi

Tôi đã có một phương pháp tĩnh mà tôi chạy từng lĩnh vực đầu vào thông qua nhưng nó thực hiện kiểm tra cơ bản như loại bỏ dấu phẩy và dấu ngoặc kép. Có ai biết làm thế nào tôi có thể thêm chức năng mà loại bỏ các ký tự không phải ASCII quá?

Trả lời

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

Điều quan trọng cần lưu ý rằng việc sử dụng mã asciiencoding sẽ thay thế tất cả các ký tự không phải ascii bằng '?' (63), có thể hoặc không thể là những gì bạn muốn hoặc mong đợi . – captncraig

+11

hơn nữa, bạn có thể kiểm tra xem nó có chứa chỉ ASCII không, nếu 's == sOut' – Jaider

1

Có vẻ kỳ lạ là nó được chấp nhận để loại bỏ không phải ASCII.

Ngoài ra tôi luôn khuyên các FileHelpers thư viện tuyệt vời cho phân tích cú pháp CSV-files.

+0

+1 Đối với liên kết FileHelpers! Trông rất hữu ích. – amelvin

7

Nếu bạn muốn thử nghiệm một nhân vật cụ thể, bạn có thể sử dụng

if ((int)myChar <= 127) 

Chỉ cần nhận được mã hóa ASCII của chuỗi sẽ không cho bạn biết rằng một nhân vật cụ thể là phi ASCII để bắt đầu với (nếu bạn quan tâm về điều đó). Xem MSDN.

48

Dưới đây là một giải pháp đơn giản:

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

nguồn: http://snipplr.com/view/35806/

+2

Giải pháp này có lợi ích khi làm việc trong các thư viện lớp di động, nơi Encoding.ASCII không có sẵn. –

+2

Nó cũng có lợi ích là nhanh hơn rất nhiều so với giải pháp được chấp nhận bởi vì nó không cần phải thực sự tạo ra một chuỗi được mã hóa. –

+1

-1; câu hỏi được hỏi về "chức năng loại bỏ các ký tự không phải ASCII", điều này không làm được. * Tiêu đề * không rõ ràng, nhưng giải pháp cho điều đó là làm rõ tiêu đề (mà tôi đã làm), không trả lời câu hỏi mà OP không hỏi. Đây có thể là câu trả lời hay cho một câu hỏi khác với câu hỏi bạn đã đăng trên đó, nhưng không phải là câu trả lời cho câu trả lời bạn đã làm. –

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

Do đó tất cả cùng một lúc

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

Dưới đây là một sự cải tiến trên các câu trả lời được chấp nhận:

string fallbackStr = ""; 

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

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

Phương pháp này sẽ thay thế các ký tự không xác định bằng giá trị fallbackStr hoặc nếu fallbackStr trống, hãy loại bỏ chúng hoàn toàn. (Lưu ý rằng enc có thể được xác định bên ngoài phạm vi chức năng.)

Các vấn đề liên quan