Перетворити кодування текстових файлів


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 все ще виглядав так само?
муру

@muru Yup! Без змін.
Відбувся Мохаммед

Відповіді:


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


@Seyed Mohammad: тепер із командами, вказаними явно.
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

Як доповнення до вирішення проблеми я підготував корисний сценарій Баша на основі iconvкоманди з відповіді Інкніса Місі :

#!/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

Цей скрипт спробує виправити кодування будь-якої кількості файлів, які вони надаються як вхідні дані. Зауважте, що файли будуть виправлені на місці, тому вміст буде перезаписано.


Вам не потрібно ставити $ файл з "  ...  ", оскільки змінні розширюються як у подвійних лапках, так і у відкритому тексті. Лише "файл-файл" буде виведено буквально, із знаком долара, за допомогою bash.
Incnis Mrsi

Як я вже згадував у відповідь на відповідь, опубліковану "Incnis Mrsi", це рішення не спрацювало, як і цей сценарій.
Відбувся Мохаммед

1

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

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

Вибачте, що я нарешті пережив свої текстові файли, тому тепер усі вони перетворені.

Я теж любив блокнот ++, ще сумую за ним.


Gedit не може виправити проблему. Хоча Gedit не показує помилку кодування для мого файлу, навіть коли він це робить, він не може його виправити. Я також спробував "зберегти як" з кодуванням UTF-8 в Gedit, але це не вирішує проблему.
Відбувся Мохаммед

1

Якщо вам подобається працювати в GUI замість CLI, як я:

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

Не працює ..
Аурімас

0

Я знайшов робоче рішення - це використання текстового редактора Microsoft Visual Studio Code, який є безкоштовним та доступним для Linux.

Відкрийте файл, який потрібно перетворити на його кодування у VS-код. У нижній частині вікна є кілька кнопок. Один з них пов'язаний з кодуванням файлів, як показано нижче:

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

Натискання цієї кнопки відкриває накладне меню, яке включає два пункти. У цьому меню виберіть параметр "Повторно відкрити кодування", як і нижче:

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

Це відкриє ще одне меню, що включає список різних кодувань, як показано нижче. Тепер виберіть "Арабська (Windows 1256)":

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

Це виправить негідний текст так:

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

Тепер знову натисніть кнопку кодування, і цього разу виберіть параметр "Зберегти за допомогою кодування", як і нижче:

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

І в новому меню виберіть варіант "UTF-8":

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

Це дозволить зберегти виправлений файл за допомогою кодування UTF-8:

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

Готово! :)


Спробував "Зберегти за допомогою кодування", але він показує попереднє кодування по-азіатськи, в моєму випадку його UTF8
chaitanya
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.