У меня есть несколько .htm
файлов, которые открываются в Gedit без каких-либо предупреждений / ошибок, но когда я открываю эти же файлы Jedit
, он предупреждает меня о недопустимой кодировке UTF-8 ...
В метатеге HTML указано «charset = ISO-8859-1». Jedit допускает Список резервных кодировок и Список авто-детекторов кодирования (в настоящее время "BOM XML-PI"), поэтому моя непосредственная проблема была решена. Но это заставило меня задуматься: а что если метаданных там не было?
Когда информация о кодировке просто недоступна, существует ли программа CLI, которая может сделать «предположение» о том, какие кодировки могут применяться?
И, хотя это немного другая проблема; есть программа CLI, которая проверяет правильность известной кодировки?
Ответы:
Команда
file
делает "лучшие предположения" о кодировке. Используйте-i
параметр для принудительнойfile
печати информации о кодировке.Демонстрация:
Вот как я создал файлы:
В настоящее время все является UTF-8. Но убедите себя:
Сравните с https://en.wikipedia.org/wiki/Ä#Computer_encoding
Преобразовать в другие кодировки:
Проверьте шестнадцатеричный дамп:
Создайте что-то «недействительное», смешав все три:
Что
file
говорит:без
-i
:Команда
file
не имеет понятия «действительный» или «недействительный». Он просто видит несколько байтов и пытается угадать, какой может быть кодировка. Как люди, мы можем понять, что файл - это текстовый файл с некоторыми умлаутами в «неправильной» кодировке. Но в качестве компьютера ему понадобится какой-нибудь искусственный интеллект.Можно утверждать, что эвристика
file
- это своего рода искусственный интеллект. Тем не менее, даже если это так, это очень ограниченный.Вот дополнительная информация о
file
команде: http://www.linfo.org/file_command.htmlисточник
, but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1.
сообщать "file file -i"unknown-8bit
. Таким образом, это также, кажется, ответ на вопрос: «Как обнаружить недопустимую / неизвестную кодировку»file -I
имеет заглавную букву «i» вместо строчных.Не всегда можно узнать наверняка, какова кодировка текстового файла. Например, последовательность байтов
\303\275
(c3 bd
в шестнадцатеричном формате) может бытьý
в UTF-8, илиý
в latin1, илиĂ˝
в latin2, или羸
в BIG-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
, я просто запустил все 1168 кодировок (включая псевдонимы), перечисленных вiconv -l
одном из моих файлов .htm ... Было проверено 683 кодировки .. Фактическая кодировка файла = ISO-8859-1 ... составлена из всех значений диапазона ASCII для одного столбца. Не-ASCII-символ был \ xA9.Также в случае, если вы подаете -i дает вам неизвестное
Вы можете использовать эту команду php, которая может угадать кодировку, как показано ниже:
В PHP вы можете проверить, как показано ниже:
Указание списка кодировки явно:
Более точные " mb_list_encodings ":
Здесь, в первом примере, вы можете видеть, что я поместил список кодировок (определите порядок списков), которые могут совпадать. Чтобы получить более точный результат, вы можете использовать все возможные кодировки с помощью: mb_list_encodings ()
Обратите внимание, что функции mb_ * требуют php-mbstring
Смотрите ответ: https://stackoverflow.com/a/57010566/3382822
источник