Команда 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