file
Komenda sprawia, że „najlepiej domysły” o kodowaniu. Użyj tego -i
parametru, aby wymusić file
wydrukowanie informacji o kodowaniu.
Demonstracja:
$ 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
Oto jak stworzyłem pliki:
$ echo ä > umlaut-utf8.txt
Obecnie wszystko jest utf-8. Ale przekonaj się:
$ hexdump -C umlaut-utf8.txt
00000000 c3 a4 0a |...|
00000003
Porównaj z https://en.wikipedia.org/wiki/Ę#Computer_encoding
Konwertuj na inne kodowania:
$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt
Sprawdź zrzut heksowy:
$ hexdump -C umlaut-iso88591.txt
00000000 e4 0a |..|
00000002
$ hexdump -C umlaut-utf16.txt
00000000 ff fe e4 00 0a 00 |......|
00000006
Utwórz coś „nieważnego”, mieszając wszystkie trzy:
$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt
Co file
mówi:
$ 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
bez -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
file
Komenda nie ma pojęcia „ważne” lub „nieprawidłowe”. Po prostu widzi niektóre bajty i próbuje zgadnąć, jakie może być kodowanie. Jako ludzie możemy być w stanie rozpoznać, że plik jest plikiem tekstowym z niektórymi umlautami w „złym” kodowaniu. Ale jako komputer potrzebowałby sztucznej inteligencji.
Można argumentować, że heurystyka file
jest pewnego rodzaju sztuczną inteligencją. Jednak nawet jeśli jest, jest bardzo ograniczony.
Oto więcej informacji o file
poleceniu: http://www.linfo.org/file_command.html