O file
comando faz "melhores palpites" sobre a codificação. Use o -i
parâmetro para forçar file
a impressão de informações sobre a codificação.
Demonstração:
$ 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
Aqui está como eu criei os arquivos:
$ echo ä > umlaut-utf8.txt
Hoje em dia tudo é utf-8. Mas convença-se:
$ hexdump -C umlaut-utf8.txt
00000000 c3 a4 0a |...|
00000003
Compare com https://en.wikipedia.org/wiki/Ä#Computer_encoding
Converta para as outras codificações:
$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt
Verifique o dump hexadecimal:
$ hexdump -C umlaut-iso88591.txt
00000000 e4 0a |..|
00000002
$ hexdump -C umlaut-utf16.txt
00000000 ff fe e4 00 0a 00 |......|
00000006
Crie algo "inválido" misturando os três:
$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt
O que file
diz:
$ 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
sem -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
O file
comando não tem idéia de "válido" ou "inválido". Ele vê apenas alguns bytes e tenta adivinhar qual pode ser a codificação. Como seres humanos, podemos reconhecer que um arquivo é um arquivo de texto com alguns tremados em uma codificação "errada". Mas, como um computador, seria necessário algum tipo de inteligência artificial.
Alguém poderia argumentar que a heurística de file
é algum tipo de inteligência artificial. No entanto, mesmo que seja, é muito limitado.
Aqui está mais informações sobre o file
comando: http://www.linfo.org/file_command.html