2012-07-14 23 views
9

Tôi có ứng dụng đa ngôn ngữ trong asp.net C#. Ở đây tôi phải tạo một tệp zip và sử dụng một số mục từ cơ sở dữ liệu để xây dựng tên tệp. Tôi loại bỏ các ký tự đặc biệt khỏi tên tệp. Tuy nhiên, nếu ngôn ngữ là tiếng Đức ví dụ như thuật toán cắt tỉa của tôi sẽ loại bỏ một số ký tự tiếng Đức như Umlaut.Xóa các ký tự không thể in C# đa ngôn ngữ

Ai đó có thể cung cấp cho tôi thuật toán cắt bớt ngôn ngữ thích ứng.

Đây là mã của tôi:

private string RemoveSpecialCharacters(string str) 
{ 
    return str; 
    StringBuilder sb = new StringBuilder(); 
    foreach (char c in str) 
    { 
     if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') | c == '.' || c == '_' || c == ' ' || c == '+') 
     { 
      sb.Append(c); 
     } 
    } 
    return sb.ToString(); 
} 

nhờ

+0

Chúng tôi có thể xem mã không? –

+0

chuỗi riêng RemoveSpecialCharacters (chuỗi str) { return str; StringBuilder sb = new StringBuilder(); foreach (char c in str) { if ((c> = '0' && c <= '9') || (c> = 'A' && c <= 'Z') || (c > = 'a' && c <= 'z') | c == '.' || c == '_' || c == '' || c == '+') { sb.Append (c); } } trả về sb.ToString(); } – josephj1989

+0

Điều đó phải có trong câu hỏi. Tôi đã thêm nó cho bạn. Và tôi không hiểu tại sao bạn ngay lập tức trả lại chuỗi gốc. –

Trả lời

5

Giả sử bạn có nghĩa là tên của tập tin ZIP, thay vì những cái tên bên trong các tập tin ZIP, bạn có thể muốn kiểm tra xem ký tự hợp lệ cho tên tệp, sẽ cho phép bạn sử dụng nhiều hơn chỉ là chữ cái hoặc chữ số:

char[] invalid = System.IO.Path.GetInvalidFileNameChars(); 

string s = "abcöü*/"; 
var newstr = new String(s.Where(c => !invalid.Contains(c)).ToArray()); 
+0

Điều này cũng sẽ cho phép OP sử dụng âm sắc vì chúng hoàn toàn hợp lệ trong tên tệp, ngoại trừ câu hỏi nói rằng đó là những gì họ muốn xóa. (Điều đó nói rằng tôi đồng ý nó vẫn là một ý tưởng tốt để kiểm tra chống lại mảng đó ngoài việc tước bỏ.) – millimoose

+0

@millimoose Tôi không thể nói nếu anh ta muốn loại bỏ các umlauts, vv, hoặc nếu anh ta phàn nàn rằng phiên bản của mình không cần thiết tước chúng ra (cụm từ OP "ngôn ngữ thích ứng"). –

+0

Điểm tốt, tôi có thể đang chiếu trường hợp sử dụng của tôi lên mọi thứ. – millimoose

5
string s = "abcöü*/"; 
var newstr = new String(s.Where(Char.IsLetterOrDigit).ToArray()); 
+0

Có vẻ ngọt ngào. Tôi đoán bạn cũng nên xử lý các trường hợp nếu tất cả các chữ cái bị tước bỏ. – Holf

+0

@ Holf Tôi sẽ để lại phần đó cho OP –

+0

Ý của bạn là: 'Ở đâu (c => char.IsLetterOrDigit (c))' –

4

A mo biến thể linh hoạt trở lại sẽ xâu chuỗi ít hơn là:

public static string RemoveDiacritics(this string s) 
{ 
    // split accented characters into surrogate pairs 
    IEnumerable<char> chars = s.Normalize(NormalizationForm.FormD); 
    // remove all non-ASCII characters – i.e. the accents 
    return new string(chars.Where(c => c < 0x7f && !char.IsControl(c)).ToArray()); 
} 

Điều này sẽ loại bỏ hầu hết các ký tự có vấn đề trong khi vẫn bảo toàn hầu hết văn bản. (Nếu bạn đang tạo tên tập tin, bạn cũng có thể muốn thay thế dòng mới và các tab với nhân vật không gian.)

+0

Chính xác hơn, nó phân tách các ký tự precomposed, do đó, khi bạn tách các ký tự không phải ASCII, bạn còn lại với ký tự cơ sở. –

+0

@Mechanicalsnail: Chính xác. Nó sẽ có khả năng phá vỡ khi lá thư cơ bản là không phải ASCII là tốt, nhưng đó không phải là trường hợp (thường) cho các ngôn ngữ Tây Âu. (Ví dụ: nó sẽ không thay thế i dotless của Thổ Nhĩ Kỳ bằng một cái bình thường.) – millimoose

1

One-liner, giả sử ASCII nơi không thể in được về cơ bản tất cả các ký tự trước khi không gian:

var safeString = new string(str.Select(c=>c<' '?'_':c).ToArray()); 
Các vấn đề liên quan