Codificación de carácteres y Java

Hace unos días estuve peleándome(otra vez) con la codificación de carácteres en Java, se puede convertir en algo divertido el no saber exáctamente con qué codificaciones trabajas en cada momento cuando tienes varios orígenes de datos y recursos.

La cuestión es que al estar utilizando Grails que por defecto en la parte web utilizará UTF-8 para generar el html(se puede modificar, pero mejor usar UTF-8 para la internacionalización de carácteres), había que tratar de poner todas las codificaciones de carácteres en común (bases de datos, ficheros de texto, ficheros javascript...).

Primero, tenemos que asegurarnos de que nuestro IDE/editor guarde nuestros ficheros con formato UTF-8, igual que nuestra base de datos guarde el contenido con esta codificación, en MySQL:
CREATE DATABASE mydatabase CHARACTER SET utf8;
CREATE TABLE mytable (
...
) ENGINE=InnoDB CHARSET=utf8;

En PostgreSQL:
CREATE DATABASE mydatabase WITH ENCODING 'UTF8';
...

Por otro lado nos encontramos que Java utiliza nativamente UTF-16 (ver el api de la clase Charset) "The native character encoding of the Java programming language is UTF-16", por lo que Groovy y Grails heredan esta codificación de carácteres.

Para seguir la uniformidad, la lectura/escritura de ficheros desde java la debemos hacer en UTF-8, la lectura la podemos hacer por medio de un InputStreamReader pasándole un FileInputStream y para la escritura por medio de un OutputStreamWriter con un FileOutputStream, y diciéndoles a ambos contructores con qué codificación, en nuestro caso UTF-8:
InputStreamReader isr = new InputStreamReader(myFileInputStream, "UTF-8")
...
OutputStreamWriter osw = new OutputStreamWriter(myFileOutputStream, "UTF-8")

Por último, y para rizar el rizo, nos encontramos que los ficheros Properties(y ResourceBundles) se cargan con codificación ISO-8859-1, por lo que en este caso nuestro editor debe escribir con esta codificación, y para leerlo programáticamente podemos hacer la transformación de la codificación a nivel de byte, esto sería:
Corregido por los comentarios de GreenEyed
ResourceBundle bundle = ResourceBundle.getBundle("com.danilat.foo")
String valueIso = bundle.getString(key)
String value = new String (valueIso.getBytes(), "ISO-8859-1");

Y en caso de que necesitemos forzar la conversión a UTF-8 de una cadena:
String valueUtf8= new String(string.getBytes("UTF-8"));

Por último, no debemos olvidarnos de añadir el tag meta content-type con el charset UTF-8 en el html, para que los navegadores sepan con qué codificación estamos mostrando nuestro contenido:
[meta http-equiv="content-type" content="text/html; charset=UTF-8"]

Como bonus, para Grails no es necesario ya que la codificación de carácteres es configurable en el Config.groovy, pero si quisieramos devolver contenido UTF-8 desde un Servlet o con un framework donde no fuera posible configurarlo, simplemente debemos acceder al objeto response y modificar la codificación de la respuesta :
response.setCharacterEncoding("UTF-8");

Si alguien quiere más explicaciones sobre codificaciones de carácteres y en particular sobre unicode, hay un artículo que para mi es de referencia de Joel Spolsky sobre Unicode, en inglés. También es interesante un post de Joaquín Cuenca en Programa con Google sobre el tema.

Por cierto, mucho cuidado con el Byte Order Mark (BOM) en ficheros UTF-8, que nos llevará a situaciones extrañas ya que Java lo reconoce como un espacio en blanco al principio de un fichero.

Entrevista en el Periódico de Aragón

Hoy se ha publicado una pequeña entrevista en el periódico de aragón que me hizo Daniel Torres Burriel, para la columna semanal que escribe sobre blogueros aragoneses.

entrevista en el peridocio de aragon

La verdad es que me costó mucho dar una explicación sobre qué es Grails y qué voy a hacer en el Summer of Code para un periódico, para que quien lo leyera al menos se hiciera una mínima idea (no se si lo he conseguido).

Por otro lado, parece que al final me han descubierto el porqué de que este blog se llame arragonán ;), quien quiera saber más en la wikipedia hay bastante información sobre el dialecto ribagorzano.

PD: Sí, lo sé, esto es autobombo :)

Fuckowski, memorias de un ingeniero

Hacía tiempo que conocía Fuckowski, memorias de un ingeniero y que tenía pendiente leer este libro, y como en las últimas semanas me lo han recomendado varias veces, he aprovechado este puente de mayo para leerlo. No puedo dejar de recomendarlo(se puede leer online desde el enlace), sobre todo a gente que trabaje en este sector, me tuvo enganchado desde la primera a la última línea y hasta altas horas de la madrugada.

Para quien no lo conozca, el libro es una novela autobiográfica en clave de humor de un ingeniero informático. El libro cuenta multitud de situaciones que pueden parecer surrealistas, pero que son bastante comunes dentro del sector TIC(aunque seguramente puedan serlo también en otros secotres), con un toque de humor simplemente genial.

Un complemento perfecto a la tira cómica de Dilbert y a la película Trabajo Basura.

Tipos de libros sobre programación

Leyendo el post Programmers Don't Read Books -- But You Should en Coding Horror. Me ha hecho pensar dos cosas:

Que no conozco muchos programadores que lean libros técnicos y en qué tipos de libros resultan más útiles.

Principalmente encuentro dos tipos de libros, los de lenguajes/frameworks específicos y los de hablan sobre lo menos técnologico del desarrollo.

Aunque parece que Jeff Atwood no acaba de ver futuro a los libros sobre lenguajes/frameworks, a mi sí que me resultan realmente útiles y les veo un largo futuro. En mi opinión si quieres conocer ya sea un lenguaje, herramienta o framework una de las mejores formas de hacerlo es cogiendo un libro sobre el tema.

Sin ir más lejos hace un tiempo que estoy leyendo el libro POJOS in Action - Developing Enterprise Applications with Lightweight Frameworks, que toca diferentes frameworks Java de los que llaman(¿o llamaban?) ligeros y cómo utilizarlos en una aplicación empresarial. Que me está ayudando a refrescar la memoria sobre algún framework, profundizar un poco en algunos otros y conocer otros tantos; y, sobre todo, en cómo y cuándo utilizarlos.

Anteriormente me leí The Pragmatic Programmer, enfocado más hacia buenas prácticas de programación generales. Dentro del tipo de libros menos técnicos podrían entrar además temas de diseño de software, usabilidad, trabajo en equipo...

Para mi cada tipo de libro resulta útil en su contexto:
Unos para cuando quiero conocer algo concreto a nivel técnico, que leeré una vez y luego lo dejaré como referencia para dudas concretas.
Y los otros cuando quiero aprender temas más orientados a buenas prácticas, a diseño de software o a posibles formas de manejar situaciones fuera de lo puramente técnico; que podré leer varias veces con el tiempo para refrescarlo, y que también puede quedar como referencia para algo en concreto.

Por cierto, ¿alguien me recomienda algún buen libro sobre HTML+CSS para añadirlo a mi lista en amazon? :)