Этому уже ответили в этом вопросе, который я заключаю в кавычки (оригинальный текст echox):
Существует 3 вида "меток времени":
- Доступ - прошлый раз файл был считан
- Измените - в прошлый раз, когда файл был изменен (содержание было изменено),
- Изменение - прошлый раз метаданные файла был изменен (например, полномочия)
Это сообщение на StackOverflow объясняет различие среди трех различных раз с точки зрения интерфейса программирования.
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
Не всегда возможно узнать наверняка, каково кодирование текстового файла. Например, последовательность байта \303\275
(c3 bd
в шестнадцатеричном), мог быть ý
в UTF-8, или ý
в latin1, или Ă˝
в latin2, или 羸
в БОЛЬШИХ 5, и так далее.
Некоторая кодировка имеет недопустимые последовательности байта, таким образом, возможно исключить их наверняка. Это верно в особенности для UTF-8; большинство текстов в большей части 8-разрядной кодировки не является допустимым UTF-8. Можно протестировать на допустимый UTF-8 с isutf8
от moreutils или с iconv -f utf-8 -t utf-8 >/dev/null
, среди других.
Существуют инструменты, которые пытаются предположить кодирование текстового файла. Они могут сделать ошибки, но они часто работают на практике, пока Вы сознательно не пытаетесь одурачить их.
file
Encode::Guess
(часть стандартного распределения), пробует последовательную кодировку на строке байтов и возвращает первое кодирование, в котором строка является действительным текстом.Если существуют метаданные (HTML/XML charset=
, TEX \inputenc
, emacs -*-coding-*-
, …) в файле усовершенствованные редакторы как Emacs или Vim часто могут проанализировать те метаданные. Это не легко автоматизировать из командной строки все же.
iconv
, Я просто выполнил все 1 168 кодировок (включая псевдонимы) перечисленный iconv -l
против одного из моих .htm файлов... Было 683 кодировки, которые передали осмотр.. Файл, фактический charset=ISO-8859-1.. составленный из всей панели значения диапазона ASCII.. Символ неASCII был \xA9.
– Peter.O
20.04.2011, 02:02
Также на случай, если вы подаете -я дам вам неизвестное
Вы можете использовать эту команду php, которая может угадать кодировку, как показано ниже:
В php вы можете проверить, как показано ниже:
Явное указание списка кодировок:
php -r "echo 'probably : '. mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1'). PHP_EOL;"
Более точные "мб _список _кодировки ":
php -r "echo 'probably : '. mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()). PHP_EOL;"
Здесь, в первом примере, вы можете видеть, что я помещаю список кодировок (определяю порядок списка ), который может совпадать. Чтобы получить более точный результат, вы можете использовать все возможные кодировки через:mb _список _кодировки()
Примечание mb _*для функций требуется php -mbstring
apt-get install php-mbstring
Думаю, этот CLI-инструмент сделает именно то, что вам нужно!
Убедитесь, что у вас установлены Node.js и NPM:
$ sudo apt install nodejs npm
Установите интерфейс командной строки:
$ npm install -g detect-file-encoding-and-language
Используйте интерфейс командной строки:
$ dfeal "/home/user name/Documents/subtitle file.srt"
# Possible result: { language: french, encoding: CP1252, confidence: 0.99 }
, but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1.
файл-i' сообщилunknown-8bit
. Так, это также, кажется, ответ на: "Как обнаружить недопустимое/неизвестное кодирование" – Peter.O 19.04.2011, 12:21