Преобразование кодировки текстовых файлов

Я часто сталкиваюсь с текстовыми файлами (такими как файлы субтитров на моем родном языке, персидском) с проблемами кодирования символов. Эти файлы создаются в Windows и сохраняются с неподходящей кодировкой (кажется, ANSI), которая выглядит тарабарщиной и нечитаемой, например:

В Windows это можно исправить легко используя персидский для преобразования кодировки в UTF-8, как показано ниже:

enter image description here

И правильный читаемый результат подобен это:

Я много искал для аналогичного решения на 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 является то, что пользователю не требуется определять источник кодирование; скорее, исходное кодирование должно быть автоматически обнаружено инструментом, и только целевое кодирование должно быть предоставлено пользователем. Но, тем не менее, я также буду рад узнать о рабочем решении, которое требует предоставления исходной кодировки.

Если кому-то нужен тестовый пример для изучения различных решений, приведенный выше пример доступен этот вопрос .

1
задан 23 May 2017 в 15:39

5 ответов

Эти файлы 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 для персидского текста была явно тупиковой: эти кодировки просто не содержат персидской буквы.

8
ответ дан 23 May 2018 в 21:24
  • 1
    @Seyed Mohammad: теперь с явно указанными командами. – Incnis Mrsi 19 August 2015 в 12:37
  • 2
    Благодаря! Вторая команда (использующая iconv). Но первый (с использованием recode) работал некорректно, и результат все еще был тарабарщин. Отредактируйте свой ответ, чтобы включить только команду iconv, и я буду отмечать ее как ответ. – Seyed Mohammad 19 August 2015 в 17:47
  • 3
    Также, чтобы быть свободным от настройки переменной LANG, можно выполнить: iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txt, который я тестировал и работал. Поэтому может быть хорошей идеей отредактировать вашу команду следующим образом. – Seyed Mohammad 19 August 2015 в 17:53
  • 4
    Я написал полезный скрипт, основанный на рабочей команде, которую я объяснил здесь в другом ответе. Надеюсь, это поможет другим персидским пользователям Linux, так как это мне очень помогает. – Seyed Mohammad 20 August 2015 в 15:05
  • 5
    @karel: Спасибо, «жалоба» - это глагол - фраза была написана неграмматически. – Incnis Mrsi 12 September 2015 в 14:02

Помимо iconv, который является очень полезным инструментом либо самостоятельно, либо в скрипте, есть действительно простое решение, которое я нашел, пытаясь выяснить ту же проблему для греческих кодировок (Windows-1253 + ISO-8859- 7).

Все, что вам нужно сделать, - открыть текстовый файл через диалог «Открыть» Gedit, а не дважды щелкнуть по нему. В нижней части диалогового окна есть раскрывающийся список для кодировки, который установлен на «Автоматически обнаруженный». Измените его на «Windows-125x» или другой подходящий набор кодов, и текст будет отлично читаем в Gedit. Затем вы можете сохранить его с помощью кодировки UTF-8, чтобы быть уверенным, что в будущем у вас не будет такой же проблемы ...

1
ответ дан 23 May 2018 в 21:24

В качестве дополнительного решения проблемы я подготовил полезный сценарий 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

Этот скрипт попытается исправить кодировку любого количества файлов, которые он предоставляет в качестве входных данных. Обратите внимание, что файлы будут исправлены на месте, поэтому содержимое будет перезаписано.

1
ответ дан 23 May 2018 в 21:24
  • 1
    Вам не нужно выставлять $ file из " ... " , поскольку переменные расширяются в двойных кавычках, а также в открытом тексте. Только '$ file' будет отображаться буквально со знаком доллара по bash. – Incnis Mrsi 21 August 2015 в 12:59
  • 2
    Как я уже упоминал в ответ на ответ, опубликованный «Incnis Mrsi», это решение не сработало, и этот сценарий тоже работает. – Seyed Mohammad 5 October 2015 в 18:23

Я не знаю, работает ли это с фарси: я использую Gedit, он вызывает ошибку при неправильном кодировании, и я могу выбрать, что я хочу перевести на UTF-8, это был просто текст, не освещенный форматом, но здесь

Извините, что я, наконец, добрался до текстовых файлов, так что теперь они все преобразованы.

Я тоже любил блокнот ++, пропустил его еще.

1
ответ дан 23 May 2018 в 21:24
  • 1
    Gedit не может решить проблему. Хотя Gedit не показывает ошибку кодирования для моего файла, даже когда он это делает, он не может исправить это. Я также попробовал " Сохранить как " с кодировкой UTF-8 в Gedit, но это не устраняет проблему. – Seyed Mohammad 16 April 2015 в 07:33

Если вам нравится работать в графическом интерфейсе вместо CLI, например:

Открыть файл с Geany (editor) Перейти в меню «Файл» -> «Обновить». Выберите предполагаемую кодировку, чтобы изменить тарабарщину на идентифицируемые символы на вашем языке. Например, чтобы прочитать греческие субтитры, я бы перезагрузил как западноевропейский -> греческий (Windows-1253). Перейти в меню «Документ»> «Установить кодировку» -> Юникод -> UTF-8 Сохранить
1
ответ дан 23 May 2018 в 21:24

Другие вопросы по тегам:

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