2010-03-06 91 views
10

Necesito obtener el contenido de texto portugués de un archivo de Excel y crear un xml que va a ser utilizado por una aplicación que no admite caracteres como "ç", "á", "é" y otros . Y no puedo simplemente eliminar los caracteres, sino reemplazarlos por su equivalente ("c", "a", "e", por ejemplo).Cómo reemplazar caracteres especiales con su equivalente (como "á" para "a") en C#?

Supongo que hay una mejor manera de hacerlo que verificando cada personaje individualmente y reemplazándolo con sus contrapartes. ¿Alguna sugerencia sobre cómo hacerlo?

+3

C y C no son "equivalentes". –

+4

son para lectura humana sin símbolos! – jehuty

Respuesta

18

Usted podría intentar algo así como

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

Esto se descompone acentos del texto, las filtra y crea una nueva cadena. La combinación de diacríticos se encuentra en la categoría Non spacing mark Unicode.

+0

Hola Ben, gracias por el fragmento, pero no maneja bien los caracteres Ł y ³ (consérvalos como originales en lugar de cambiar a L y 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

Aunque es la solución más simple (tal vez no la más elegante) hace exactamente lo que quiere. Sería más agradable si creó una función reutilizable (con una lista estática de reemplazos). Una desventaja de este enfoque es que necesita conocer TODOS los caracteres posibles que desea reemplazar y tiene que agregar caracteres en mayúscula y minúscula a la lista (y eso puede llevar algo de prueba y error). Además, es probable que cometa errores al copiar los enunciados add para crear nuevos elementos (por ejemplo, olvide reemplazar una de las cadenas), lo que puede causar confusión cuando se producen errores. – Gertjan

2

Para referencia futura, esto es exactamente lo que terminó 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

El realizan es mejor con esta solución:

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

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