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 ++?
enca
ychardet
para sistemas POSIX.iconv
en 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.chardet
ochardetect
no está disponible en su sistema, puede instalar el paquete a través de su administrador de paquetes (por ejemploapt search chardet
, en ubuntu / debian, generalmente se llamapython-chardet
opython3-chardet
) o mediante pip withpip install chardet
(opip install cchardet
para la versión c-optimizada más rápida).Respuestas:
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,0xBF
es 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:
0xFF,0xFE
los primeros 2 bytes. Por lo que puedo decir, Notepad ++ los describe como "UCS-2" ya que no admite ciertas facetas de UTF-16.fuente
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.
fuente