El file
comando hace "mejores conjeturas" sobre la codificación. Use el -i
parámetro para forzar file
a imprimir información sobre la codificación.
Demostración:
$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt: text/plain; charset=utf-16le
umlaut-utf8.txt: text/plain; charset=utf-8
Así es como creé los archivos:
$ echo ä > umlaut-utf8.txt
Hoy en día todo es utf-8. Pero convéncete a ti mismo:
$ hexdump -C umlaut-utf8.txt
00000000 c3 a4 0a |...|
00000003
Compare con https://en.wikipedia.org/wiki/Ä#Computer_encoding
Convierte a las otras codificaciones:
$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt
Verifique el volcado hexadecimal:
$ hexdump -C umlaut-iso88591.txt
00000000 e4 0a |..|
00000002
$ hexdump -C umlaut-utf16.txt
00000000 ff fe e4 00 0a 00 |......|
00000006
Crea algo "inválido" mezclando los tres:
$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt
Lo que file
dice:
$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt: application/octet-stream; charset=binary
umlaut-utf16.txt: text/plain; charset=utf-16le
umlaut-utf8.txt: text/plain; charset=utf-8
sin -i
:
$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt: data
umlaut-utf16.txt: Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt: UTF-8 Unicode text
El file
comando no tiene idea de "válido" o "inválido". Simplemente ve algunos bytes e intenta adivinar cuál podría ser la codificación. Como humanos, podríamos reconocer que un archivo es un archivo de texto con algunas diéresis en una codificación "incorrecta". Pero como computadora necesitaría algún tipo de inteligencia artificial.
Se podría argumentar que la heurística de file
es algún tipo de inteligencia artificial. Sin embargo, incluso si es así, es muy limitado.
Aquí hay más información sobre el file
comando: http://www.linfo.org/file_command.html