Posts Tagged ‘charset’

Problemas con charset con JSF y messages.properties

mayo 14, 2012

Estoy desarrollando un aplicación web con JBOSS AS 7.1 usando JSF. Este tipo de emprendimientos los hacía usando Spring. Entiendo que Java EE 6 tiene muchas cosas que antes eran características de Spring, por eso me animé al salto.

Todo venía bien (con las marchas y contramarchas propias del self made java ee developer) hasta que tope con un problema de encoding del message.properties.

Parece que por defecto te imprime los carácteres en el locale de la máquina. Mi sistema operativo para mi idioma usa iso-latin-1. Los templates están en utf8, el message.properties está en utf-8. Desastre en puerta.

Googleando un poco me enteré que por cuestiones de implementación, las properties no puede usar código que no estén en el mapa de latin-1.

Una manera de evitar el problema era representar los caracteres especiales con la notación \u####, donde #### es el código UTF del carácter. Esto se podía hacer trabajando con el archivo en utf8 y a la hora de desplegar, convertir el archivo original en código ASCII + \u#### usando la herramienta native2ascii provista con la jdk.

Medio lastimoso.

En la url citada más arriba proponen sustituir la implementación del resource bundle por una que soporte UTF-8. El código lo puede ver en el artículo Internationalization in JSF with UTF-8 encoded properties files. El único cambio que le hice fue usar otra ubicación para el archivo por messages.properties, cambiándola en la constante BUNDLE_NAME = “messages”.

Con eso funcionó de pelos.

Por un momento extrañé a Spring 😛

Anuncios

A colación de la Collation…

diciembre 26, 2007

Un problema típico trabajando con cadenas y comparaciones es como lidiar con cuestiones de acentos y la diferencia de mayúsculas y minúsculas.

El problema surge de que la computadora guarda los caracteres como (sucesiones de) bytes: así la letra A es un byte 65 o 0x41, la B es 66 o 0x42, la a es 97 o 0x61 y, en la tabla ISO-8859-1 á es 160 o 0xA0. Cuando la computadora compara los bytes A es disntito de a y de á. Esto es extrictamente cierto y necesario, pero hay (muchas) veces en la que es un efecto no deseado.

La solución más común es “normalizar” las cadenas para búsquedas y comparaciones. Para eso hacemos unas funciones muy bonitas que termina metiéndole mano hasta el kiosquero de la esquina.

Este enfoque no es malo, pero en seguida resulta ineficiente, ya que por cada búsqueda o comparación hay que normalizar. Para eso nuestro DBA amigo nos sugirió crear un campo donde podamos guardar nuestra cadena normalizada -pobre tipo, ya tiene bastante lío revirtiendo nuestros accidentes-. Nosotros, codeadores empedernidos sentimos un poco de frustración por guardar dos veces lo que podemos calcular con nuestra superfunción. Pero todo sea en nombre de la concurrencia y el rendimiento.

¿Nadie resolvió esto ya?

¡Sí!

¡Para eso se inventó la Collation de nuestras bases de datos, tablas, o incluso de nuestros campos!

Lo que hace la Collation es establecer un orden alternativo independiente del mapeo de caracteres. Es una secuencia de orden alternativa. No es un algoritmo de ordenación.

De esta manera nuestra base de datos ya nos provee el tratamiento de cadenas con caracteres especiales.

Si quisiéramos aplicar Collation en una base MySQL para un campo con charset utf8 utilizaríamos utf8_spanish_ci.

Si quisiéramos aplicar Collation para un campo con charset iso-8859-1 (latin-1) latin1_spanish_ci.

Se puede leer más y mejor en la documentación de mysql para charset utf-8 y para el caso iso-8859-1.

El tema tiene mucha tela para cortar y dejo esto para empzar. Ya volveremos con algo más interesante.

Saludos y ¡buen año!

Problemas con Charset y PHP

octubre 9, 2007

Los problemas de charset surgen de dos cuestiones:

  • Estoy abriendo una fuente utf-8 y mi salida se ve en iso-8859-1
  • o bien el opuesto: iso-8859-1 la fuente, salida utf-8

Vamos a “simular” que abrimos un archivo XML y tenemos problemas con el charset.

Primer caso

Diagnóstico: Por lo general el primer caso se da cuando veo en vez de eñes y acentos dos caracteres. Suelen ser un à y algo más. En el ejemplo el archivo XML estaría codificado en utf-8 (caso más común) y nuestra página se ve en iso-8859-1

Solución: La fuente está viniendo en utf8 y necesito pasarlo a Latin-1. Esto se hace con la función utf8_decode().

$origen = "http://algunblog/feed/";

//CURL mediante o file_get_contents
//En este caso hacemos la conversion de utf-8
//a iso-8859-1
$contenido = utf8_decode(file_get_contents($origen));

$xml = simplexml_load_string($contenido);
//"masajeamos" el contenido del XML

Segundo caso

Diagnóstico: En vez de caracteres especiales vemos unos signos de interrogación o cuadraditos con números. Esto significa que no puede traducir el caracter a alguno Unicode porque está “mal formado”.

Solución: Hay que convertir nuestra cadena a utf-8 mediante la función utf8_encode().

$origen = "http://algunblog/feed/";

//CURL mediante o file_get_contents
//En este caso hacemos la conversion de iso-8859-1
//a utf-8
$contenido = utf8_encode(file_get_contents($origen));

$xml = simplexml_load_string($contenido);
//"masajeamos" el contenido del XML

Estos son los dos casos básicos. Desde ya que esto tiene una explicación un poco más teórica, pero que vamos a abordar en otro post o tal vez le dediquemos una página. Por ahora con esto ya podemos solucionar muchos problemas.

Cuando trabajemos con bases de datos también tenemos que tener en cuenta estas consideraciones. Tenemos ventajas además, por lo general nos permite seleccionar el encoding de la conexión. El parámetro suele llamarse “charset”.

Mi intención es fundar la SALPICADA (Sociedad Argentina por la Lucha contra Problemas Indescifrables de Charset Accediendo a Datos y Archivos) para investigar el tema, capacitar y ofrecer ayuda. Evitemos que nuestras páginas terminen SALPICADAs por feos caracteres que hacen los textos menos legibles.

Cualquier duda, acá estoy.

Problema con acentos, ñs y CakePHP

agosto 17, 2007

Haciendo pruebas con una aplicación que tengo para proyectos, encontré que cuando cargo acentos, ñs u otros caracteres latinos CakePHP me cortaba las cadenas a partir de la primer ocurrencia del caracter “malo”.

¡Oh no! ¡Problemas de charset! Como estoy con la versión 1.1.16.x no tengo soporte de internacionalización, ni nada.

Googlear fue inútil. No encontré nada. La cuestión es que me fije la codificación del navegador y era la fatídica “Europa Occidental (Windows)”.

CakePHP usa utf-8 para comunicarse con la base de datos. A su vez presupone que se le pasan datos utf-8. Cuando el navegador mandaba los datos los mandaba en latin-1, CakePHP los procesaba como si fueran utf-8 y ahí venía el problema.

Esto pasa porque el servidor está andando sobre Windows y por defecto envía las páginas como iso-8859-1. Basta con corregir esto para que vuelva a funcionar.

¿Cómo eludir el problema sin tener que modificar el código del núcleo ni la configuración del servidor (recordar que esto no siempre está al alcance de uno)?

Agregando en el <head> de la aplicación (dir_aplicacion)/views/layouts/defaults.thtml el siguiente tag:

<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />

Con eso se arregló y ya tengo mis acentos!

Saludos, y hasta la próxima.