Detectar si un fichero está codificado en UTF-8 puede parecer sencillo, pero al profundizar, se revela más complejo de lo esperado. A continuación, una breve introducción teórica y un enfoque práctico para realizar esta tarea en Java.
Introducción teórica a la codificación UTF-8
Los archivos se almacenan como arrays de bytes que luego se asocian a caracteres mediante distintas codificaciones como ASCII, ISO-8859-1, y UTF-8. Para manejar de manera uniforme los caracteres de todos los idiomas, se creó Unicode, que asocia códigos numéricos a cada símbolo, utilizado por cualquier lenguaje del mundo y facilitando su representación informática.
UTF-8 es una codificación variable que representa caracteres Unicode utilizando de 1 a 4 bytes, permitiendo una serialización eficiente de texto en ficheros o flujos de datos. Esta variabilidad en el tamaño de bytes es la razón por la que algunos ficheros se ven corruptos cuando se leen con una codificación incorrecta o con caracteres extraños.
Algoritmo para detectar si un archivo es UTF-8
El proceso es sencillo: basta leer el fichero byte a byte, verificando que cada byte sigue las reglas de esta codificación.
- Si el byte es menor que 0x7F (0111 1111), es válido y representa un caracter de 1 byte.
- Si el byte coincide con la máscara 110xxxxx, compruebo que el siguiente byte cumple con la máscara 10xxxxxx. En este caso indica que forman un caracter de 2 bytes.
- De manera similar, se detectan caracteres de 3 o 4 bytes
Si alguna condición no se cumple, el fichero no sigue la codificación esperada. De lo contrario, tiene una codificación compatible.
Aunque hay implementaciones más eficientes, este enfoque en Java es útil para validar archivos.