jueves, noviembre 22, 2007

Java y la codificación de caracteres (parte 1)

ADVERTENCIA: Alto contenido técnico, posiblemente demasiado aburrido para leerlo. Tómese un café, salúdeme por mensajería instantánea o correo electrónico, o recorra Google :-)

Hoy NO hablaré ni de política, ni de fútbol, ni de acuerdos del gobierno, ni del Transantiago.

Uno de los mayores dolores de cabeza al que me he enfrentado han sido las codificaciones de caracteres en Java. A los brillantes del SII se les ocurrió que los documentos tributarios deben llegar en XML codificado en ISO-8859-1, siendo que UTF-8 es mucho más completo en cuanto a la representación de los caracteres, y siendo que ellos mismos responden en UTF-8 (inconsistencias a nivel estatal, mira que lindo...)

Por definición Java opera con UNICODE, que es a lo menos parecido a UTF-8. La codificación del Locale de casi todos los sabores de Linux que uno quisiera instalar es, por defecto, UTF-8. Y para peor, muchas de las librerías Open Source para el manejo de texto, presuponen que uno opera con UTF-8. Claro que para darse cuenta de ello hay que revisar las palabras con caracteres especiales a nivel de bytes, cosa que sinceramente casi nadie hace (si es que no he sido el único...)

Mi problema:
Convertir caracteres especiales como áéíóú ÁÉÍÓÚ ñÑ àèìòù ÀÈÌÒÙ äëïöü ÄËÏÖÜ âêîôû ÂÊÎÔÛ ºª y otras rarezas que normalmente son ingresadas por errores de tipeo, por ejemplo un espacio acentuado (' ó `) en vez de comilla simple o apóstrofe ('), a su representación HTML, donde por ejemplo la a acentuada (á) queda como á o en su defecto como &#;

Las posibles soluciones:
  1. Apache provee de una librería llamada apache.commons.lang que tiene algunos métodos para estos fines.
  2. Hacer un reemplazo contra una tabla de mapeo de caracteres.
  3. Hacer un reemplazo basado en los códigos numéricos de los caracteres especiales.

Contras:
  1. Un solo contra: Cualquiera de estas soluciones (incluso la de Apache que supone ser al menos la más pensada) supone que el String original viene en UTF-8.

Les debo los enlaces y los ejemplos concretos (estoy algo atareado, si embargo era imperante documentar públicamente estos alcances).
Publicar un comentario