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

115

En mi sistema de archivos (Windows 7) tengo algunos archivos de texto (estos son archivos de script SQL, si eso es importante).

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

¿Cual es la diferencia aquí? Todos parecen ser guiones perfectamente válidos. ¿Cómo podría saber qué codificaciones tiene el archivo sin Notepad ++?

Marcel
fuente
77
Hay una forma bastante simple de usar Firefox. Abra su archivo usando Firefox, luego Ver> Codificación de caracteres. Detallado aquí .
Catherine Gasnier
utilizar heurística pago encay chardetpara sistemas POSIX.
Janus Troelsen
3
Creo que una respuesta alternativa es PRUEBA y ERROR. iconven particular es útil para este propósito. Esencialmente, itera las cadenas de caracteres / texto corruptos a través de diferentes codificaciones para ver cuál funciona. Ganas cuando los personajes ya no están corrompidos. Me encantaría responder aquí, con un ejemplo programático. Pero desafortunadamente es una pregunta protegida.
Brandon Bertelsen
FF está utilizando Mozilla Charset Detectors . Otra forma sencilla es abrir el archivo con MS Word, adivinará los archivos correctamente incluso para varias páginas de códigos antiguas chinas y japonesas
phuclv
Si chardeto chardetectno está disponible en su sistema, puede instalar el paquete a través de su administrador de paquetes (por ejemplo apt search chardet, en ubuntu / debian, generalmente se llama python-chardeto python3-chardet) o mediante pip with pip install chardet(o pip install cchardetpara la versión c-optimizada más rápida).
ccpizza

Respuestas:

97

Los archivos generalmente indican su codificación con un encabezado de archivo. Hay muchos ejemplos aquí . Sin embargo, incluso leyendo el encabezado nunca puede estar seguro de qué codificación está utilizando realmente un archivo .

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

Notepad ++ hace todo lo posible para adivinar qué codificación está usando un archivo, y la mayoría de las veces lo hace bien. Sin embargo, a veces se equivoca, es por eso que el menú 'Codificación' está allí, por lo que puede anular su mejor suposición.

Para las dos codificaciones que mencionas:

  • Los archivos "UCS-2 Little Endian" son archivos UTF-16 (basados ​​en lo que entiendo de la información aquí ), así que probablemente comience con 0xFF,0xFElos primeros 2 bytes. Por lo que puedo decir, Notepad ++ los describe como "UCS-2" ya que no admite ciertas facetas de UTF-16.
  • Los archivos "UTF-8 sin BOM" no tienen bytes de encabezado. Eso es lo que significa el bit "sin BOM".
vaughandroid
fuente
3
Lista de materiales: msdn.microsoft.com/en-us/library/windows/desktop/…
Jan Doggen
2
¿Por qué un archivo que comienza con una BOM se detectaría automáticamente como "UTF-8 sin BOM"?
Michael Borgwardt
2
Y si un archivo comenzó con 0xFF, 0xFE, debería detectarse automáticamente como UTF-16, no como UCS-2. UCS-2 probablemente se adivina porque contiene principalmente caracteres ASCII y, por lo tanto, cualquier otro byte es nulo.
Michael Borgwardt
2
Con experiencia, por desgracia, los metadatos ("encabezados") también pueden estar equivocados. La base de datos que contiene la información podría estar dañada o el cargador original podría haberlo entendido mal. (Esto ha sido un problema importante para nosotros en los últimos meses; algunos datos se cargaron como "UTF-8", excepto que era "realmente ISO8859-1, ¡ya que son lo mismo realmente!") ¡Bah! Los científicos deben mantenerse lejos del origen de los metadatos; simplemente se equivocan ...)
Donal Fellows
1
En realidad, creo que es "divertido" que el problema de codificación aún permanezca en 2014 ya que ningún archivo en el mundo comenzará con "ï» ¿"y estoy muy sorprendido cuando veo una página HTML que se ha cargado con la codificación incorrecta. Es una cuestión de probabilidad. Es impensable elegir la codificación incorrecta si otra codificación evitaría caracteres extraños. Supongo que buscar la codificación que evita caracteres extraños funcionaría en el 99,9999% de los casos. Pero todavía hay errores ... También es un mensaje muy confuso usar ascii en lugar de UTF8 para ahorrar espacio ... es confuso para los desarrolladores junior esta idea de realizar ...
Anterior
18

No se puede. Si pudiera hacer eso, no habría tantos sitios web o archivos de texto con "galimatías aleatorias". Es por eso que la codificación generalmente se envía junto con la carga útil como metadatos.

En caso de que no sea así, todo lo que puede hacer es una "suposición inteligente", pero el resultado es a menudo ambiguo ya que la misma secuencia de bytes puede ser válida en varias codificaciones.

Marco
fuente
2
Entonces, ¿el sistema operativo Windows almacena esa información (metadatos) en algún lugar? En el registro probablemente?
Marcel
Te equivocas. Eso es páginas de códigos, no exactamente lo mismo. Hay algoritmos para adivinar la codificación Unicode.
DeadMG
66
@Marcel: No. Es por eso que los "archivos de texto" son tan problemáticos para cualquier cosa que no sea ASCII puro.
Michael Borgwardt
bueno, notepad ++ puede hacer esto, puede decirle si el archivo de texto está codificado con utf-8 o no
user25