💾 Archived View for tilde.team › ~rami › iconv_chardetect.gmi captured on 2024-12-17 at 11:35:45. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
רמי
SUBJECT: CHARDETECT / ICONV: Определение и переконвертирование кодировки текстового файла в консоли
AUTHOR: Rami Rosenfeld
DATE: 22/11/24
TIME: 20.00
LANG: ru, en
LICENSE: GNU FDL 1.3
TAGS: gnu, gnome, software, opensource, linux, system, man, manual, bash, privacy, security, rhel, centos, mate, xfce, lxde, spin, de, converter, text, charset, chardetect, iconv
Исследовал тему и создал небольшое руководство - себе на заметку; рано или поздно оно пригодится.
Предположим, что имеется файл с неизвестной кодовой страницей (на самом деле, это "правильный" текст UTF-8, содержащий все символы английского и русского языка).
Просмотрим его содержимое:
cat unknown_codepage.txt
1234567890-= qwertyuiop[]\ asdfghjkl;' zxcvbnm,./ !@#$%^&*()_+ йцукенгшщзхъ\ фывапролджэ ячсмитьбю.
Определим кодовую страницу исходного файла:
chardetect unknown_codepage.txt
unknown_codepage.txt: utf-8 with confidence 0.99
Примечание: Достоверность результата: 0.99.
Просмотрим список (и правильные названия) всех кодовых страниц, поддерживаемых утилитой iconv:
iconv --list
Следующий список содержит все известные встроенные кодировки. Это не обязательно означает, что можно использовать любые комбинации данных имён в параметрах командной строки FROM и TO. Одна и та же кодировка может быть указана под несколькими именами (псевдонимами). 437, 500, 500V1, 850, 851, 852, 855, 856, 857, 858, 860, 861, 862, 863, 864, 865, 866, 866NAV, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3, 8859_4, 8859_5, 8859_6, 8859_7, 8859_8, 8859_9, 10646-1:1993, 10646-1:1993/UCS4, ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4, ANSI_X3.110-1983, ANSI_X3.110, ARABIC (...)
Переконвертируем исходный файл в WINDOWS-1251 (кириллическая кодировка: старые версии Windows)
iconv -f UTF-8 -t WINDOWS-1251 unknown_codepage.txt > CP-1251_output.txt
где
-f ENCODING - предполагаемая кодировка исходного файла;
-t ENCODING - кодировка конечного (результирующего) файла.
Определим кодовую страницу полученного файла:
chardetect CP-1251_output.txt
CP-1251_output.txt: ISO-8859-8 with confidence 0.6881232062682825
ВАЖНО: chardetect НЕТОЧНО определила кодировку полученного файла, пометив его как "Latin/Hebrew alphabet" (с достоверностью всего 0.6 от единицы).
Просмотрим содержимое полученного файла:
cat CP-1251_output.txt 1234567890-= qwertyuiop[]\ asdfghjkl;' zxcvbnm,./ ДАЛЕЕ СЛЕДУЕТ НЕПРАВИЛЬНО ОТОБРАЖАЕМОЕ СОДЕРЖИМОЕ (...)
Примечание: Консоль GNU/Linux работает в кодировке UTF-8, поэтому, что естественно, некорректно отображает переконвертированные кириллические символы.
Однако если открыть полученный файл в любом GUI-редакторе, например GEdit или Gnome-text-editor, то кириллические символы тоже могут выглядеть весьма прискорбно:
(...) !@#$%^&*()_+ éöóêåíãøùçõú\ ôûâàïðîëäæý ÿ÷ñìèòüáþ.
Что произошло? Как правило, текстовые редакторы имеют функцию автоопределения, крайне некорректно подбирающую "правильную" кодовую страницу (см. аналогичную ошибку chardetect выше). Но если открыть полученный файл следующим образом: "Открыть" - "Кодировка Символов" - "Кириллица WINDOWS-1251", то все отобразится адекватно.
Чтобы убедиться в правильности перекодировки между кодовыми страницами, осуществим обратную операцию, принудительно указав кодировку WINDOWS-1251 у файла CP-1251_output.txt (предварительно скопируем его в новый файл - input.txt) и UTF-8 - у конечного файла (назовем его output.txt).
cp CP-1251_output.txt input.txt
'CP-1251_output.txt' -> 'input.txt'
iconv -f WINDOWS-1251 -t UTF-8 input.txt > output.txt
Проверим кодировку полученного "обратного" файла:
chardetect output.txt
output.txt: utf-8 with confidence 0.99
Проверим - правильно ли отображаются кириллические символы в файле:
cat output.txt
1234567890-= qwertyuiop[]\ asdfghjkl;' zxcvbnm,./ !@#$%^&*()_+ йцукенгшщзхъ\ фывапролджэ ячсмитьбю.
Дополнительно см.: man chardetect; man iconv
🄯 Rami Rosenfeld, 2024. GNU FDL 1.3.