Java, UTF-8 y BOM

Publicado en Java el 23 de January, 2008 por Lek.

Esta semana ha vuelto cual boomerang un viejo problema que tuve hace tiempo. Este problema consiste en leer/escribir un archivo codificado en UTF-8 y que utilice BOM (Byte Order Marks).

La JVM de Sun, cómo no, tiene un bug que no se va a corregir y no lo maneja demasiado bien. De hecho, no lo maneja en absoluto y los trata como caracteres normales, corrientes y molientes. Al escribir, los 3 caracteres (0xEF0xBB0xBF) tendréis que añadirlos a mano. Pero al leer es donde está el verdadero problema a menos que queráis buscarlos y eliminarlos manualmente.

En una primera búsqueda encontré que se podría utilizar la clase DataInputStream, pero por mi experiencia también tiene un bug por el que el método readUTF() intenta leer más allá de la extensión del propio fichero, lo que hace que no sirva. Al final la solución pasa por hacer la siguiente ñapa sideral con clases del paquete java.nio:

FileReader fr = new FileReader (path);
BufferedReader br = new BufferedReader (fr);

String fichero = "";
String aux = "";
while ((aux = br.readLine ()) != null) {
    fichero += aux + "\n";
}

//Putas chonadas que hay que hacer...
fichero = Charset.forName ("UTF-8").decode (
        ByteBuffer.wrap (fichero.getBytes ())).toString ();
fr.close ();
br.close ();

Para más información sobre los formatos UTF, leed UTF : Java Glossary.

4 comentarios

  1. # String aux = “”;
    # while ((aux=br.readLine()) != null) {
    # fichero += aux + “\n”;
    # }

    Esos StringBuffer… mariquilla, que luego se nos sube la memoria a la chepa, sobre todo si manejas ficheros grandes, como los que te dije :P

    #  Bellz 23 de January, 2008

  2. jeje… bueno, el ejemplo es bastante viejo (más de año y medio) y tenía pendiente ponerlo aquí tras ponerlo en el grupo de 4bits.

    Lo único que cambia es la redacción (y ni tanto) por las nuevas experiencias.

    #  Lek 24 de January, 2008

  3. Hay otro ejemplo practico de lectura y escritura de archivos UTF8 en la siguiente pagina http://howto-noimat.blogspot.com/2009/12/crear-archivos-utf8-con-java.html

    #  jsilvestro 23 de December, 2009

  4. Gracias por el ejemplo, aunque no sé si funcionará con BOM… será cuestión de probarlo :D

    #  Lek 23 de December, 2009

Escribe un comentario