2010-03-06 52 views
10

我需要得到葡萄牙文本內容了一個Excel文件,並創建要由不支持的字符,如「C」,「A」,「E」,和其他應用程序中使用的XML 。我不能刪除這些字符,而是將它們替換爲相應的字符(例如「c」,「a」,「e」)。如何用C#中的特殊字符(例如「á」代替「a」)?

我想有一個更好的方式來做到這一點比逐個檢查每個字符,並與同行進行更換。有關如何做的建議?

+3

C和C不是「等同」。 – 2010-03-06 19:54:21

+4

他們是爲沒有符號的人閱讀! – jehuty 2010-03-06 19:55:24

回答

18

你可以嘗試像

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

這口音分解從文本,過濾它們,並創建一個新的字符串。結合變音符號在Non spacing mark unicode類別中。

+0

喜奔,感謝你的片斷,但它沒有處理好字符L和L(讓他們作爲原來的地切換到L和L)。 – binball 2012-02-06 17:52:30

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

雖然它是最簡單的解決方案(也許不是最優雅的),但它確實是你想要的。如果你創建了一個可重用的函數(用一個靜態的替換列表)會更好。這種方法的一個缺點是,你需要知道你想要替換的所有可能的字符,並且必須在列表中添加大小寫字符(這可能需要一些試驗和錯誤)。另外,當複製添加語句以創建新項目(例如忘記替換某個字符串)時,您可能會犯錯誤,這些錯誤可能會導致錯誤發生。 – Gertjan 2010-03-09 10:43:13

2

以供將來參考,這正是我結束了:

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

的執行是該解決方案更好:

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

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