Как я могу протестировать кодирование текстового файла …, действительно ли это допустимо, и что это?

Этому уже ответили в этом вопросе, который я заключаю в кавычки (оригинальный текст echox):

Существует 3 вида "меток времени":

  • Доступ - прошлый раз файл был считан
  • Измените - в прошлый раз, когда файл был изменен (содержание было изменено),
  • Изменение - прошлый раз метаданные файла был изменен (например, полномочия)

Это сообщение на StackOverflow объясняет различие среди трех различных раз с точки зрения интерфейса программирования.

49
27.01.2019, 01:30
4 ответа

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

63
27.01.2020, 19:34
  • 1
    Спасибо, которое работало... Я попробовал 'файл, 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

Не всегда возможно узнать наверняка, каково кодирование текстового файла. Например, последовательность байта \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
  • Perl Encode::Guess (часть стандартного распределения), пробует последовательную кодировку на строке байтов и возвращает первое кодирование, в котором строка является действительным текстом.
  • Enca является кодированием guesser и преобразователем. Можно дать ему имя языка и текст, который Вы предполагаете, находится на том языке (поддерживаемые языки являются главным образом восточноевропейскими языками), и это пытается предположить кодирование.

Если существуют метаданные (HTML/XML charset=, TEX \inputenc, emacs -*-coding-*-, …) в файле усовершенствованные редакторы как Emacs или Vim часто могут проанализировать те метаданные. Это не легко автоматизировать из командной строки все же.

21
27.01.2020, 19:34
  • 1
    Спасибо за хороший обзор... Да, "лучшее предположение" может быть единственной опцией, когда кодирование не известно... Используя 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 

См. ответ:https://stackoverflow.com/a/57010566/3382822

1
27.01.2020, 19:34

Думаю, этот 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 }
2
24.03.2021, 14:56

Теги

Похожие вопросы