2010-03-06 29 views
10

Ho bisogno di ottenere il contenuto di testo portoghese da un file Excel e creare un xml che verrà utilizzato da un'applicazione che non supporta caratteri come "ç", "á", "é" e altri . E non posso semplicemente rimuovere i caratteri, ma sostituirli con il loro equivalente ("c", "a", "e", ad esempio).Come sostituire i caratteri speciali con i loro equivalenti (come "á" per "a") in C#?

Suppongo che ci sia un modo migliore per farlo che controllare singolarmente ogni carattere e sostituirlo con le loro controparti. Qualche suggerimento su come farlo?

+3

C e C non sono "equivalenti". –

+4

sono per la lettura umana senza simboli! – jehuty

risposta

18

Si potrebbe provare qualcosa di simile

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

Questo decompone accenti dal testo, li filtra e crea una nuova stringa. La combinazione di segni diacritici si trova nella categoria unicode Non spacing mark.

+0

Ciao Ben, grazie per il frammento ma non gestisce bene i caratteri Ł e ł (mantienili come originali invece di passare a L e 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

Sebbene sia la soluzione più semplice (forse non la più elegante), fa esattamente ciò che vuoi. Sarebbe più bello se crei una funzione riutilizzabile (con un elenco statico di sostituzioni). Uno svantaggio di questo approccio è che è necessario conoscere TUTTI i possibili caratteri che si desidera sostituire e aggiungere all'elenco caratteri maiuscoli e minuscoli (e ciò potrebbe richiedere alcuni tentativi ed errori). Inoltre è probabile che si verifichino errori durante la copia delle istruzioni di aggiunta per creare nuovi elementi (ad esempio, dimenticare di sostituire una delle stringhe) che potrebbe causare confusione quando si verificano errori. – Gertjan

2

Per riferimento futuro, questo è esattamente ciò che ho finito con:

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

La eseguire è meglio con questa soluzione:

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

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