Я часто сталкиваюсь с текстовыми файлами (такими как файлы субтитров на моем родном языке, персидском) с проблемами кодирования символов. Эти файлы создаются в Windows и сохраняются с неподходящей кодировкой (кажется, ANSI), которая выглядит тарабарщиной и нечитаемой, например:
В Windows это можно исправить легко используя персидский для преобразования кодировки в UTF-8, как показано ниже:
И правильный читаемый результат подобен это:
Я много искал для аналогичного решения на GNU / Linux, но, к сожалению, предлагаемые решения (например, этот вопрос) не работают. Больше всего я видел, как люди предлагали iconv и recode, но мне не повезло с этими инструментами. Я проверил множество команд, включая следующие, и все провалились:
$ recode ISO-8859-15..UTF8 file.txt
$ iconv -f ISO8859-15 -t UTF-8 file.txt > out.txt
$ iconv -f WINDOWS-1252 -t UTF-8 file.txt > out.txt
Ни один из них не работал!
Я использую Ubuntu-14.04, и я ищу для простого решения (GUI или CLI), которое работает так же, как и Notepad ++.
Важным аспектом существования iconv является то, что пользователю не требуется определять источник кодирование; скорее, исходное кодирование должно быть автоматически обнаружено инструментом, и только целевое кодирование должно быть предоставлено пользователем. Но, тем не менее, я также буду рад узнать о рабочем решении, которое требует предоставления исходной кодировки.
Если кому-то нужен тестовый пример для изучения различных решений, приведенный выше пример доступен этот вопрос .
Эти файлы Windows с персидским текстом закодированы в Windows-1256. Поэтому он может быть расшифрован командой, подобной OP, но с разными кодировками. А именно:
recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt (денонсировано по жалобам оригинального плаката, см. Комментарии)
iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt
Предполагается, что переменная среды LANG установлена в локаль UTF-8. Чтобы преобразовать в любую кодировку (UTF-8 или иначе), независимо от текущей локали, можно сказать:
iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}
Оригинальный плакат также путают с семантикой инструментов перекодировки текста (recode, iconv). Для исходной кодировки (источник .. или -f) необходимо указать кодировку, с которой файл Windows-1256 (созданной программой). Не некоторые (наивные) догадки, основанные на персонажах моджибаке в программах, которые пытаются (но не могут) прочитать его. Попытка либо ISO-8859-15, либо WINDOWS-1252 для персидского текста была явно тупиковой: эти кодировки просто не содержат персидской буквы.
Помимо iconv, который является очень полезным инструментом либо самостоятельно, либо в скрипте, есть действительно простое решение, которое я нашел, пытаясь выяснить ту же проблему для греческих кодировок (Windows-1253 + ISO-8859- 7).
Все, что вам нужно сделать, - открыть текстовый файл через диалог «Открыть» Gedit, а не дважды щелкнуть по нему. В нижней части диалогового окна есть раскрывающийся список для кодировки, который установлен на «Автоматически обнаруженный». Измените его на «Windows-125x» или другой подходящий набор кодов, и текст будет отлично читаем в Gedit. Затем вы можете сохранить его с помощью кодировки UTF-8, чтобы быть уверенным, что в будущем у вас не будет такой же проблемы ...
В качестве дополнительного решения проблемы я подготовил полезный сценарий Bash на основе команды iconv из ответа Incnis Mrsi:
#!/bin/bash
if [ $# -lt 1 ]
then
echo 'Specify at least one file to fix.'
exit 1
fi
# Temp file to store conversion attempt(s).
tmp='tmp.fixed'
for file in "$@"
do
# Try to fix the file encoding.
if iconv -f WINDOWS-1256 "$file" -t UTF-8 > $tmp; then
echo "Fixed: '$file'"
cat $tmp > "$file"
else
echo "Failed to fix: '$file'"
fi
done
rm $tmp
Сохраните этот скрипт как fix-encoding.sh, дайте ему выполните разрешение с помощью chmod +x fix-encoding.sh и используйте его следующим образом:
./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub
Этот скрипт попытается исправить кодировку любого количества файлов, которые он предоставляет в качестве входных данных. Обратите внимание, что файлы будут исправлены на месте, поэтому содержимое будет перезаписано.
Я не знаю, работает ли это с фарси: я использую Gedit, он вызывает ошибку при неправильном кодировании, и я могу выбрать, что я хочу перевести на UTF-8, это был просто текст, не освещенный форматом, но здесь
Извините, что я, наконец, добрался до текстовых файлов, так что теперь они все преобразованы.
Я тоже любил блокнот ++, пропустил его еще.
Если вам нравится работать в графическом интерфейсе вместо CLI, например:
Открыть файл с Geany (editor) Перейти в меню «Файл» -> «Обновить». Выберите предполагаемую кодировку, чтобы изменить тарабарщину на идентифицируемые символы на вашем языке. Например, чтобы прочитать греческие субтитры, я бы перезагрузил как западноевропейский -> греческий (Windows-1253). Перейти в меню «Документ»> «Установить кодировку» -> Юникод -> UTF-8 Сохранить