2010-03-06 10 views
10

Tôi cần lấy nội dung văn bản tiếng Bồ Đào Nha ra khỏi tệp Excel và tạo xml sẽ được sử dụng bởi ứng dụng không hỗ trợ các ký tự như "ç", "á", "é" và các ngôn ngữ khác . Và tôi không thể chỉ loại bỏ các ký tự, nhưng thay thế chúng bằng các ký tự tương đương ("c", "a", "e").Làm cách nào để thay thế các ký tự đặc biệt bằng các ký tự đặc biệt của chúng (chẳng hạn như "á" cho "a") trong C#?

Tôi giả sử có cách tốt hơn để làm điều đó hơn là kiểm tra từng ký tự một và thay thế bằng các đối tác của chúng. Bất kỳ đề xuất về cách làm điều đó?

+3

C và C không phải là "tương đương". –

+4

chúng dành cho người đọc mà không có biểu tượng! – jehuty

Trả lời

18

Bạn có thể thử một cái gì đó giống như

var decomposed = "áéö".Normalise(NormalizationForm.FormD); 
var filtered = decomposed.Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark); 
var newString = new String(filtered.ToArray()); 

này phân tách điểm nhấn từ các văn bản, lọc chúng và tạo ra một chuỗi mới. Kết hợp dấu phụ nằm trong danh mục unicode Non spacing mark.

+0

Hi Ben, cảm ơn bạn vì đoạn trích nhưng nó không xử lý tốt ký tự Ł và ł (giữ chúng như ban đầu thay vì L và l). – binball

3
string text = {text to replace characters in}; 

Dictionary<char, char> replacements = new Dictionary<char, char>(); 

// add your characters to the replacements dictionary, 
// key: char to replace 
// value: replacement char 

replacements.Add('ç', 'c'); 
... 

System.Text.StringBuilder replaced = new System.Text.StringBuilder(); 
for (int i = 0; i < text.Length; i++) 
{ 
    char character = text[i]; 
    if (replacements.ContainsKey(character)) 
    { 
     replaced.Append(replacements[character]); 
    } 
    else 
    { 
     replaced.Append(character); 
    } 
} 

// 'replaced' is now your converted text 
+0

Mặc dù nó là giải pháp đơn giản nhất (có thể không phải là thanh lịch nhất) nó thực hiện chính xác những gì bạn muốn. Sẽ đẹp hơn nếu bạn tạo một hàm có thể tái sử dụng (với một danh sách thay thế tĩnh). Một nhược điểm của phương pháp này là bạn cần biết TẤT CẢ các ký tự có thể bạn muốn thay thế và phải thêm cả ký tự chữ hoa và chữ thường vào danh sách (và có thể mất một số thử và lỗi). Ngoài ra, bạn có thể mắc lỗi khi sao chép các câu lệnh bổ sung để tạo các mục mới (ví dụ: quên thay thế một trong các chuỗi) có thể gây nhầm lẫn khi xảy ra lỗi. – Gertjan

2

Để tham khảo trong tương lai, đây là chính xác những gì tôi đã kết thúc với:

temp = stringToConvert.Normalize(NormalizationForm.FormD); 
      IEnumerable<char> filtered = temp; 
      filtered = filtered.Where(c => char.GetUnicodeCategory(c) != System.Globalization.UnicodeCategory.NonSpacingMark); 
      final = new string(filtered.ToArray()); 
0

Các thực hiện là tốt hơn với giải pháp này:

string test = "áéíóúç"; 

string result = Regex.Replace(test .Normalize(NormalizationForm.FormD), "[^A-Za-z| ]", string.empty);