¿Cómo puedo ver qué codificación se usa en un archivo?

23

Tuve algunos problemas con los archivos de subtítulos en el video omxplayer. Para resolverlo tuve que convertir de Windows-1250 a la codificación UTF-8. Mi pregunta es, ¿cómo puedo ver para algún archivo específico qué codificación se utiliza?

Modelo no estándar
fuente
piconvcambiar la codificación;)
Rinzwind
Sí. Ya he cambiado la codificación (en 1 archivo). Pero tengo muchos de estos y quería hacer un pequeño script que los controlara a todos y luego se ocultara si fuera necesario. Pero supongo que puedo convertirlos a todos. No se hará daño si alguno ya está en UTF-8. ¿Correcto?
NonStandardModel
No es un problema, no :) Solo use un comodín
Rinzwind

Respuestas:

26

Realmente no puede averiguar automáticamente si un archivo se escribió originalmente con codificación X.

Sin embargo, lo que puede hacer fácilmente es verificar si el archivo completo se puede decodificar con éxito de alguna manera (pero no necesariamente correctamente) utilizando un códec específico. Si encuentra bytes que no son válidos para una codificación dada, debe ser otra cosa.

El problema es que muchos códecs son similares y tienen los mismos "patrones de bytes válidos", simplemente interpretándolos como caracteres diferentes. Por ejemplo, una äcodificación en una podría corresponder a éotra o øa una tercera. La computadora realmente no puede detectar qué forma de interpretar el byte da como resultado un texto legible por humanos (a menos que tal vez si agrega un diccionario para todo tipo de idiomas y le permite realizar correcciones ortográficas ...). También debe saber que algunos conjuntos de caracteres son en realidad subconjuntos de otros, como, por ejemplo, la codificación ASCII es parte de los códecs más utilizados, como algunos de la familia ANSI o UTF-8. Eso significa, por ejemplo, un texto guardado como UTF-8 que solo contiene caracteres latinos simples, sería idéntico al mismo archivo guardado como ASCII.


Sin embargo, volvamos de explicar lo que no puede hacer a lo que realmente puede hacer:

Para una verificación básica de los archivos de texto ASCII / no ASCII (normalmente UTF-8), puede usar el filecomando. Sin embargo, no conoce muchos códecs y solo examina los primeros kB de un archivo, suponiendo que el resto no contendrá ningún carácter nuevo. Por otro lado, también reconoce otros tipos de archivos comunes como varios scripts, documentos HTML / XML y muchos formatos de datos binarios (que no son interesantes para comparar archivos de texto) y puede imprimir información adicional si hay líneas extremadamente largas o qué Se utiliza el tipo de secuencia de nueva línea (por ejemplo, UNIX: LF, Windows: CR + LF).

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text

Si eso no es suficiente, puedo ofrecerle el script de Python que escribí para esta respuesta aquí , que escanea archivos completos e intenta decodificarlos usando un conjunto de caracteres específico. Si tiene éxito, esa codificación es un candidato potencial. De lo contrario, si hay bytes que no pueden decodificarse con él, puede eliminar ese conjunto de caracteres de su lista.

Byte Commander
fuente
ANSI no es realmente el nombre de ninguna codificación de caracteres. Quizás esté pensando en códigos de escape ANSI, que se pueden expresar con la codificación de caracteres ASCII.
kasperd
@kasperd Lo más probable es que se refiera a una de las familias de páginas de códigos ISO 8859 o Windows. Para los desarrolladores de Windows de América del Norte, la codificación ANSI a menudo significa la codificación de Windows 1252 por razones históricas.
user1937198
Sí, bueno, ANSI es básicamente ASCII (códigos 0-127) más una página de códigos específica de la localidad (códigos 128-255). Así que tienes razón ...
Byte Commander
Más información: ¿Qué es el formato ANSI?
wjandrea
12

Un programa llamado filepuede hacer esto. Ejemplo:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators

Si está interesado en cómo se hace, vea src/encoding.c.

Arkadiusz Drabczyk
fuente
2
Puede adivinar , de todos modos.
hobbs
2
filehace una suposición, y con frecuencia no es muy buena. Por ejemplo, en mis pruebas, identificó erróneamente tanto MacRoman como CP-1252 como ISO-8859, con el resultado de que "š" y "ß" estaban codificados.
Mark
Genial 👌! ¡Pasé algunas horas para encontrar la codificación correcta de mi .sqlarchivo anterior y filedemostré que es un gziparchivo comprimido!
Amirreza Nasiri