Преобразовать кодировку текстового файла

15

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

введите описание изображения здесь

В Windows это легко исправить, используя Notepad ++ для преобразования кодировки в 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 ++.

Одним из важных аспектов «простоты» является то, что пользователю не требуется определять исходную кодировку; скорее исходная кодировка должна автоматически обнаруживаться инструментом, и только целевая кодировка должна предоставляться пользователем. Но, тем не менее, я также буду рад узнать о работающем решении, которое требует предоставления исходной кодировки.

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

Сейед Мухаммед
источник
2
Попробуйте: vim '+set fileencoding=utf-8' '+wq' file.txt.
Муру
Фарси должен быть, iso-639но этого, кажется, нет в наличии iconvили recode. По крайней мере, я не вижу этого в выводе iconv -l.
тердон
@muru Я проверил ваше предложение, vimно оно не сработало.
Сейед Мохаммед
@SeyedMohammad все еще выглядел так же?
Муру
@ Муру Да! Без изменений.
Сейед Мухаммед

Ответы:

12

Эти файлы 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). Для исходной кодировки ( source.. или -f) необходимо указать кодировку, с которой файл сохраняется (программой, которая его создала). Не некоторые (наивные) догадки, основанные на символах моджибаке в программах, которые пытаются (но не могут) прочитать его. Попытка или ISO-8859-15 или WINDOWS-1252 для персидского текста была явно тупиком: эти кодировки просто не содержат никаких персидских букв.

Incnis Mrsi
источник
@ Сид Мохаммеда: теперь с командами, указанными явно.
Incnis Mrsi
Благодарность! Вторая команда (та, которая использует iconv) сработала. Но первый (использующий recode) не работал должным образом, и результат все еще был бессмысленным. Отредактируйте свой ответ, включив в него только iconvкоманду, и я отмечу его как ответ.
Сейед Мухаммед
1
Также, чтобы быть свободным от настройки переменной LANG, можно сделать: iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txtчто я тестировал и работал. Так что может быть хорошей идеей отредактировать вашу команду следующим образом.
Сейед Мохаммад
Я написал полезный скрипт на основе рабочей команды, который я объяснил в другом ответе здесь. Я надеюсь, что это поможет другим персидским Linux-пользователям, так как мне очень поможет.
Сейед Мохаммад
@karel: Спасибо, «жаловаться» - это глагол - фраза написана неграмотно.
Incnis Mrsi
1

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

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

Giorgos_tph
источник
1

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

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

Сейед Мухаммед
источник
Вам не нужно помещать $ file из «  …  », поскольку переменные раскрываются в двойных кавычках, а также в открытом тексте. Только '$ file' будет отображаться буквально, со знаком доллара, с помощью bash.
Incnis Mrsi
Как я уже упоминал в ответе, опубликованном «Incnis Mrsi», это решение не сработало, как и этот сценарий.
Сейед Мухаммед
1

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

введите описание изображения здесь

Извините, я наконец-то просмотрел свои текстовые файлы, и теперь они все конвертированы.

Я тоже любил блокнот ++, скучаю по нему до сих пор.

Кен Моллеруп
источник
Гедит не может решить проблему. Хотя Gedit не показывает ошибку кодирования для моего файла, даже когда он это делает, он не может это исправить. Я также попытался «сохранить как» с кодировкой UTF-8 в Gedit, но это не решает проблему.
Сейед Мохаммед
1

Если вам нравится работать в GUI вместо CLI, как я:

  1. Открыть файл с помощью Geany (редактор)
  2. Зайдите в меню Файл -> Перезагрузить как
  3. Выберите предполагаемую кодировку, чтобы изменить тарабарщину на идентифицируемые символы на вашем языке. Например, чтобы прочитать греческие подводные лодки, я бы перезагрузил как Западноевропейский -> Греческий (Windows-1253)
  4. Перейдите в меню Документ > Установить кодировку -> Юникод -> UTF-8
  5. Сохранить
Christos
источник
Не работает ..
Ауримас
0

Я нашел работающее решение с помощью текстового редактора кода Microsoft Visual Studio, который является бесплатным и доступен для Linux.

Откройте файл, который вы хотите преобразовать в кодировку VS-Code. В нижней части окна есть несколько кнопок. Один из них связан с кодировкой файла, как показано ниже:

введите описание изображения здесь

При нажатии на эту кнопку появляется всплывающее меню, которое включает в себя два элемента. В этом меню выберите «Открыть заново с кодированием», как показано ниже:

введите описание изображения здесь

Это откроет другое меню, которое включает в себя список другой кодировки, как показано ниже. Теперь выберите «Арабский (Windows 1256)»:

введите описание изображения здесь

Это исправит тарабарщину:

введите описание изображения здесь

Теперь нажмите кнопку кодирования еще раз и на этот раз выберите опцию «Сохранить с кодированием», как показано ниже:

введите описание изображения здесь

И в новом меню выберите опцию «UTF-8»:

введите описание изображения здесь

Это сохранит исправленный файл с использованием кодировки UTF-8:

введите описание изображения здесь

Выполнено! :)

Сейед Мухаммед
источник
Пробовал «Сохранить с кодировкой» , но он показывает предыдущее кодирование agian, в моем случае его UTF8
Чайтание