Eliminando acentos de un string con ASP.NET y C#. 2 formas distintas de eliminar los acentos de manera eficiente.

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)

11 pensamientos en “Eliminando acentos de un string con ASP.NET y C#. 2 formas distintas de eliminar los acentos de manera eficiente.

  1. Eliminar Acentos con .Net Utilizando Expresiones Regulares | Tecnico Programador

  2. 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!!!

Deja un comentario