Clase Normalizer (Java)

Necesitando un día hacer un strip de caracteres de un String fui a dar con la novedad, para mi obviamente, de que en Java 6 existe la clase Normalizer en el paquete java.text la cuál nos brinda como dice el Java doc un método normalize el cuál transforma texto Unicode en su forma equivalente compuesta o decompuesta, que nos facilita la clasificación y búsqueda de texto, ó en mi caso un strip de caracteres o DeAccent.

Para fines prácticos, el método normalize transforma el texto Unicode que nosotros le enviemos en texto normalizado o bien, texto bajo una misma norma estándar, basado en la estandarización de normalización Unicode descrita en  Unicode Standard Annex #15 — Unicode Normalization Forms.

Esto es que como bien sabemos no estamos solos en este planeta, existen miles de personas más que usan computadora y tienen su propia forma de escribir, con sus acentuaciones, símbolos y demás. Es por eso que fue necesaria una estandarización de texto Unicode que normalizara el texto para ponerlo todo en un mismo contexto. Una palabra acentuada Día es normalizada (decompuesta) a Di'a, como ven la letra con acentuación fue separada, por lo que al tener el acento como un caracter separado es muy fácil eliminarlo.

Ejemp: Imagine que usted tiene que hacer un buscador de texto en un sitio de libros, el cuál debe permitir buscar texto libre, total y parcialmente el texto que el usuario vaya a teclear. ¿De que forma podría usted encontrar palabras acentuadas o simbolizadas? Lo primero que se me viene a la mente es que si no tuvieran acentos entonces no sería un problema, y por consiguiente necesito quitar acentos en las palabras a buscar y la biblioteca de palabras en las que lo haré. Ahora, ¿De que forma puedo quitar acentos  a esas palabras? -Normalización Unicode.
Veamos el ejemplo:


public String stripAccents(String strToStrip){
   String strStripped = null;
   //Normalizamos en la forma NFD (Canonical decomposition)
   strToStrip = Normalizer.normalize(strToStrip, Normalizer.Form.NFD);
   //Reemplazamos los acentos con una una expresión regular de Bloque Unicode
   strStripped = strToStrip.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
   
   return strStripped;
}

La forma de normalización que usamos es la llamada Canonical decomposition la cuál descompone en forma canónica en la que los caracteres están ordenados en un orden específico. Esto lo puedes ver en Normalizer.Form.

La expresión regular que usamos "\p{InCombiningDiacriticalMarks}" es una propiedad de bloque Unicode la cual engloba en un rango de caracteres diacríticos y lo reemplazamos por "" vacío para eliminar ese acento.

Problema resuelto! Es lo que yo usé más sin embargo no descarto y exista una mejor forma de hacerlo. Comenten si tienen una mejor forma de hacerlo o cualquier duda o corrección o sugerencia que tengan.

4 comentarios

Categories

Seguidores

MarceStarlet. Con la tecnología de Blogger.
Powered By Blogger