lunes, octubre 05, 2009

Java y la pesadilla del encoding: Invalid byte 2 of 2-byte UTF-8 sequence

Advertencia: Nota sin relevancia para el lector casual. Acepto saludos, completos y cervezas.

Haciendo unas validaciones de Schema contra ciertos XML que estoy recibiendo me enfrenté a un error recurrente:
Invalid byte 2 of 2-byte UTF-8 sequence

Lo peor de todo es que a simple vista no había nada extraño o fuera de lugar en el XML. Después de realizar algunas pruebas y de buscar en Google, di con la respuesta. Lo que sucede es que se gatilla este error cuando la codificación del archivo no concuerda con lo especificado en la cabecera del XML, ie: si mi cabecera dice
< ?xml version="1.0" encoding="UTF-8"? >
se esperará que el archivo efectivamente este almacenado como UTF-8.

Dado eso sospeché que el archivo estaba en otra codificación, como por ejemplo WINDOWS-1252, o ISO-8859-1, cambié la definición a ISO, y funcionó sin problemas. El truco para asegurarse de ser consistente con los encodings es:
  • O pasar el parámetro -Dfile.encoding=UTF-8 (en mi caso era UTF-8) como parámetro del comando java
  • O rescatar los Strings especificando la codificación de caracteres, y guardando los archivos como ByteStreams especificando el encoding.
No en vano dicen que el encoding es uno de los monstruos y pesadillas de los desarrolladores de software.

Referencia: http://www.biglist.com/lists/xsl-list/archives/200702/msg00044.html

No hay comentarios.: