2 de abril de 2012

Caracteres especiales en archivos en una aplicación Android

Realizando una aplicación para Android (o para Java, daría lo mismo) me encontré con un problema al transferir archivos con caracteres especiales en el nombre, con eñes, tildes, etc. Aquí va la solución que encontré, por si puede servir a alguien.

El problema

El problema afecta a quien intente compilar una aplicación para Android con Windows, por cierto.

Necesitamos trabajar con una serie de archivos que emplean caracteres especiales, acentos y demás en los nombres de los archivos. El no emplearlos no es una solución. Además, esto sucede también con caracteres especiales de otros idiomas, como alemán con su ß o con el francés, griego, rumano e incluso el chino. El problema se encuentra en que si bien Android funciona con UTF-8, Windows utiliza una codificación diferente, ISO-8859-1 o Windows-1252. El caso es que esos caracteres, al trasladarse por el compilador a la aplicación Android se transforman perdiendo sus caracteres especiales, que quedan reemplazados por una interrogación o por un rombo con una interrogación.

Todos estos archivos los intentaba trasladar desde la carpeta assets hasta el dispositivo Android para luego allí tratarlos, pero no se llegaba a compilar.  La primera solución fue la de comprimir los archivos y trasladarlos como un zip para luego descomprimirlos en el otro lugar. Esto hacía que funcionase, pero al descomprimir los nombres aparecían corruptos.

La solución

La solución más rápida, por supuesto, era dejar de usar Windows y emplear un sistema operativo que codificase los nombres de archivo en formato UTF-8. No obstante encontré esta solución alternativa que funciona perfectamente.

El problema nuevamente es que al comprimir los archivos con la mayoría de las aplicaciones de compresión actuales, suelen hacerlo empleando la codificación que se usa en el sistema operativo, con lo cual los nombres ya se envían mal en el propio zip.

Por suerte hay un compresor muy extendido y de código abierto, 7Zip, que resuelve el problema, al permitir indicar en su configuración el tipo de codificación que queremos emplear, en este caso UTF-8. Se puede hacer incluso desde el propio interface indicando el valor cu  en los parámetros del archivo.


De ese modo el archivo almacena los nombres en UTF-8 y al descomprimirlo mediante la aplicación Android se respetan todos los caracteres especiales.

Sólo hay que mantener alguna precaución si necesitamos modificar los nombres. Debemos emplear siempre este programa para realizar las modificaciones o recomprimir de nuevo los archivos.

Y eso fue lo que aprendí después de dos días de buscar soluciones y convertir y reconvertir nombres de un formato a otro. No he encontrado ninguna solución consistente a través de métodos en Java. No sé si alguien conoce alguna solución que lo resuelva mediante código.

Ahora en inglés para la comunidad de visitantes extranjeros. :-)

UTF-8, file names with special characters and Android

I was trying to figure out how to copy several files from asset folder to the Android device. The files has special characters, like german special characters, greek, french o romanian. It happens even with chinesse characters.

I found out that I could copy all this files zipped in one single file, but when I unzipped it in the Android SD folder, the names lost their special characters.

It seems to be a problem with the charset used in Windows, different from UTF-8, the one used in Android, so I used 7zip to pack the files. In 7zip you can set the codification of the filenames adding cu in the Parameter dialog, in the GUI. It results in a zip file with all the filenames in UTF-8, ready to be copied.

I hope it can be helpful (and sorry for my english, I am working on it).