file
Команда робить «Бест-здогади» про кодуванні. Використовуйте -i
параметр, щоб змусити file
друкувати інформацію про кодування.
Демонстрація:
$ 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
Ось як я створив файли:
$ echo ä > umlaut-utf8.txt
Сьогодні все є utf-8. Але переконайте себе:
$ hexdump -C umlaut-utf8.txt
00000000 c3 a4 0a |...|
00000003
Порівняйте з https://en.wikipedia.org/wiki/Ä#Computer_encoding
Перетворити в інші кодування:
$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt
Перевірте шістнадцятковий дамп:
$ hexdump -C umlaut-iso88591.txt
00000000 e4 0a |..|
00000002
$ hexdump -C umlaut-utf16.txt
00000000 ff fe e4 00 0a 00 |......|
00000006
Створіть щось "недійсне", змішавши всі три:
$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt
Що file
говорить:
$ 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
без -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
Команда не має ні найменшого уявлення про «дійсно» або «недійсним». Він просто бачить кілька байтів і намагається відгадати, якою може бути кодування. Ми, як люди, зможемо розпізнати, що файл - це текстовий файл з деякими умовами в "неправильному" кодуванні. Але як комп’ютер йому знадобиться якийсь штучний інтелект.
Можна стверджувати, що евристика Росії file
- це якийсь штучний інтелект. Але, навіть якщо він є, він дуже обмежений.
Ось більш детальна інформація про file
команду: http://www.linfo.org/file_command.html