¿Cómo detectar la codificación de un archivo?

En mi sistema de archivos (Windows 7) tengo algunos archivos de texto (Son archivos de script SQL, si eso importa).

Cuando se abre con Notepad++, en el menú "Codificación" algunos de ellos se informa de que tienen una codificación de "UCS-2 Little Endian" y algunos de "UTF-8 sin BOM".

¿Cuál es la diferencia? Todas parecen ser escrituras perfectamente válidas. ¿Cómo podría saber qué codificaciones tiene el archivo sin Notepad++?

Solución

Los archivos suelen indicar su codificación con una cabecera de archivo. Hay muchos ejemplos aquí. Sin embargo, incluso leyendo la cabecera nunca se puede estar seguro de qué codificación está utilizando realmente un archivo.

Por ejemplo, un archivo con los tres primeros bytes 0xEF,0xBB,0xBF es probablemente un archivo codificado en UTF-8. Sin embargo, podría ser un archivo ISO-8859-1 que casualmente comienza con los caracteres . O puede ser un tipo de archivo totalmente diferente.

Notepad++ hace todo lo posible por adivinar qué codificación utiliza un archivo, y la mayoría de las veces acierta. Sin embargo, a veces se equivoca - por eso está el menú "Codificación", para que pueda anular su mejor suposición.

Para las dos codificaciones que mencionas:

  • Los archivos "UCS-2 Little Endian" son archivos UTF-16 (basado en lo que entiendo de la información aquí) así que probablemente comienzan con 0xFF,0xFE como los primeros 2 bytes. Por lo que sé, Notepad++ los describe como "UCS-2" ya que no soporta ciertas facetas de UTF-16.
  • Los archivos "UTF-8 sin BOM" no tienen ningún byte de cabecera. Eso es lo que significa el bit "sin BOM".
Comentarios (10)

No se puede. Si pudiera hacerlo, no habría tantos sitios web o archivos de texto con "galimatías aleatorio" por ahí. Por eso la codificación suele enviarse junto con la carga útil como metadatos.

Si no es así, lo único que se puede hacer es una "suposición inteligente", pero el resultado suele ser ambiguo, ya que la misma secuencia de bytes puede ser válida en varias codificaciones.

Comentarios (4)