Seguramente, en algún momento, te vas a ver obligado a eliminar los acentos (y no solo los acentos) de un string. Esto lo podemos hacer de varias formas y las vamos a ver a continuación.
Eliminando acentos con Regular Expression (o Expresiones Regulares)
Pues sí, amigos míos, mejor que utilizar el método Replace de un string es usar Expresiones Regulares, ya que son mucho más eficientes.
Para poder eliminar los acentos por medio de las Regular Expression, tendremos que hacer el using de System.Text.RegularExpressions, y la faena es tan simple como definir una Regular Expression con los caracteres que serán reemplazados y después, hacer el Replace por medio de esta expresión regular.
El código necesario para eliminar los acentos de una a, sería el siguiente:
Regex replace_a_Accents = new Regex("[á|à|ä|â]", RegexOptions.Compiled);
inputString = replace_a_Accents.Replace(inputString, "a");
Y ahora, unicamente tenemos que hacer lo mismo con el reto de vocales. Asi que al final el método quedaría así:
public static string RemoveAccentsWithRegEx(string inputString)
{
Regex replace_a_Accents = new Regex("[á|à|ä|â]", RegexOptions.Compiled);
Regex replace_e_Accents = new Regex("[é|è|ë|ê]", RegexOptions.Compiled);
Regex replace_i_Accents = new Regex("[í|ì|ï|î]", RegexOptions.Compiled);
Regex replace_o_Accents = new Regex("[ó|ò|ö|ô]", RegexOptions.Compiled);
Regex replace_u_Accents = new Regex("[ú|ù|ü|û]", RegexOptions.Compiled);
inputString = replace_a_Accents.Replace(inputString, "a");
inputString = replace_e_Accents.Replace(inputString, "e");
inputString = replace_i_Accents.Replace(inputString, "i");
inputString = replace_o_Accents.Replace(inputString, "o");
inputString = replace_u_Accents.Replace(inputString, "u");
return inputString;
}
Si quieres descargarte el código de ejemplo, para poder ver cómo funciona con una prueba unitaria, lo puedes hacer desde aquí.
Eliminando acentos con Normalización Unicode.
Algunas secuencias de Unicode, se consideran equivalentes porque representan el mismo carácter. Eso sí, los valores Unicode son distintos por lo tanto las comparaciones binarias los consideran distintos.
Así pues, si normalizamos un código Unicode, esta normalización nos va a devolver el Unicode “primario” o básico.
El .Net Framework, en su versión 2.0, incluía una serie de clases para trabajar con secuencias Unicode, y eliminar acentos (que no nos olvidemos que es lo que nos trae aquí), se convierte en una tarea sumamente sencilla.
Únicamente tenemos que normalizar un string de manera que nos devuelva los tipos primarios. La clase NormalizationForm nos va a permitir realizar esto, y además contiene unos miembros que indican que tipo de normalización queremos, en nuestro caso el que necesitaremos es FromC que indica que una cadena se normalizara mediante descomposición canónica reemplazando siempre que sea posible por tipos primarios.
El código necesario es el siguiente, y no olvides de hacer el using de System.Globalization, que es donde están todas estas clases:
public static string RemoveAccentsWithNormalization(string inputString)
{
string normalizedString = inputString.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < normalizedString.Length; i++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(normalizedString[i]);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(normalizedString[i]);
}
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
Y ahora únicamente, lo ya dicho, descárgate este código y pruébalo mediante un unit test y seguro que te ayuda a comprender como funciona esto.
Enlaces relacionados
Descargas (Download)
Esto es todo amigos, y ahora os dejo, que he quedado para comer.
Gracias por el truco. Me ha sido de mucha ayuda.
Un saludo.
dnd.
me alegro que este blog tenga una utilidad.
saludos.
Muy útil la versión unicode. Gracias.
gracias a ti por visitar este blog y por el agradecimiento.
saludos.
Gente como tú hace esto más grande.
Muy bueno el post
Gracias!!!
gracias a ti. me alegro que te haya gustado.
un saludo.
Gracias, lo utilizo y lo apunto en mi blog.
gracias a ti por leer el blog.
un saludo.
Eliminar Acentos con .Net Utilizando Expresiones Regulares | Tecnico Programador
Hola que tal, te quiero agradecer por compatir este método que se encarga de eliminar acentos, ya que me ha sido de mucha ayuda, porque habia intentado otras cosas pero nada efectivo hasta ahorita. Que estes bien, saludos bye!!!
Gracias a ti.