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


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

Благодарность! Вторая команда (та, которая использует 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, просто чтобы быть уверенным, что в будущем у вас больше не возникнет такой же проблемы ...


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. Сохранить

Не работает ..
Ауримас

0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Пробовал «Сохранить с кодировкой» , но он показывает предыдущее кодирование agian, в моем случае его UTF8
Чайтание
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.