Il file
comando fa "ipotesi" sulla codifica. Utilizzare il -i
parametro per forzare la file
stampa di informazioni sulla codifica.
Dimostrazione:
$ 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
Ecco come ho creato i file:
$ echo ä > umlaut-utf8.txt
Oggi tutto è utf-8. Ma convinciti:
$ hexdump -C umlaut-utf8.txt
00000000 c3 a4 0a |...|
00000003
Confronta con https://en.wikipedia.org/wiki/Ä#Computer_encoding
Converti in altre codifiche:
$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt
Controlla la discarica esadecimale:
$ hexdump -C umlaut-iso88591.txt
00000000 e4 0a |..|
00000002
$ hexdump -C umlaut-utf16.txt
00000000 ff fe e4 00 0a 00 |......|
00000006
Crea qualcosa di "non valido" mescolando tutti e tre:
$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt
Cosa 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
senza -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
Il file
comando non ha idea di "valido" o "non valido". Vede solo alcuni byte e prova a indovinare quale potrebbe essere la codifica. Come umani potremmo essere in grado di riconoscere che un file è un file di testo con alcune sfumature in una codifica "errata". Ma come computer avrebbe bisogno di una sorta di intelligenza artificiale.
Si potrebbe sostenere che l'euristica di file
una sorta di intelligenza artificiale. Tuttavia, anche se lo è, è molto limitato.
Ecco ulteriori informazioni sul file
comando: http://www.linfo.org/file_command.html