Konversi Pengodean File Teks

15

Saya sering menemukan file teks (seperti file subtitle dalam bahasa ibu saya, Persia ) dengan masalah pengkodean karakter. File-file ini dibuat pada Windows, dan disimpan dengan pengkodean yang tidak cocok (tampaknya ANSI), yang terlihat omong kosong dan tidak dapat dibaca, seperti ini:

masukkan deskripsi gambar di sini

Di Windows, orang dapat memperbaikinya dengan mudah menggunakan Notepad ++ untuk mengkonversi pengkodean ke UTF-8, seperti di bawah ini:

masukkan deskripsi gambar di sini

Dan hasil yang dapat dibaca adalah seperti ini:

masukkan deskripsi gambar di sini

Saya telah mencari banyak solusi serupa di GNU / Linux, tetapi sayangnya solusi yang disarankan (mis. Pertanyaan ini ) tidak berfungsi. Yang paling penting, saya telah melihat orang-orang menyarankan iconvdan recodetetapi saya tidak beruntung dengan alat-alat ini. Saya telah menguji banyak perintah, termasuk yang berikut, dan semuanya gagal:

$ 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 

Tidak ada yang berhasil!

Saya menggunakan Ubuntu-14.04 dan saya sedang mencari solusi sederhana (baik GUI atau CLI) yang berfungsi seperti halnya Notepad ++.

Salah satu aspek penting dari menjadi "sederhana" adalah bahwa pengguna tidak diharuskan untuk menentukan pengkodean sumber; alih-alih pengkodean sumber harus secara otomatis dideteksi oleh alat dan hanya pengodean target yang harus disediakan oleh pengguna. Namun demikian, saya juga akan senang mengetahui tentang solusi yang membutuhkan sumber pengkodean untuk disediakan.

Jika seseorang memerlukan test case untuk memeriksa solusi yang berbeda, contoh di atas dapat diakses melalui tautan ini .

Sayyid Mohammad
sumber
2
Cobalah: vim '+set fileencoding=utf-8' '+wq' file.txt.
muru
Farsi seharusnya iso-639tetapi itu tampaknya tidak tersedia dalam salah satu iconvatau recode. Setidaknya, saya tidak melihatnya di keluaran iconv -l.
terdon
@muru Saya menguji saran Anda dengan vimtetapi tidak berhasil.
Seyed Mohammad
@SeyedMohammad masih terlihat sama?
muru
@muru Yup! Tidak ada perubahan.
Seyed Mohammad

Jawaban:

12

File Windows ini dengan teks Persia dikodekan dalam Windows-1256 . Jadi bisa diuraikan dengan perintah yang mirip dengan OP yang dicoba, tetapi dengan rangkaian karakter yang berbeda. Yaitu:

recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(dikecam atas keluhan poster asli; lihat komentar)

iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt

Yang ini mengasumsikan bahwa variabel lingkungan LANG diatur ke lokal UTF-8. Untuk mengkonversi ke pengkodean apa pun (UTF-8 atau yang lain), terlepas dari lokal saat ini, orang dapat mengatakan:

iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}

Poster asli juga bingung dengan semantik alat pengodean ulang teks (recode, iconv). Untuk pengkodean sumber ( source.. atau -f) seseorang harus menentukan pengkodean dengan mana file disimpan (oleh program yang membuatnya). Tidak beberapa tebakan (naif) berdasarkan karakter mojibake dalam program yang mencoba (tetapi gagal) untuk membacanya. Mencoba ISO-8859-15 atau WINDOWS-1252 untuk teks Persia jelas merupakan jalan buntu: pengodean ini tidak mengandung huruf Persia.

Incnis Mrsi
sumber
@Seyed Mohammad: sekarang dengan perintah yang ditentukan secara eksplisit.
Incnis Mrsi
Terima kasih! Perintah kedua (yang menggunakan iconv) bekerja. Tetapi yang pertama (menggunakan recode) tidak bekerja dengan benar dan output masih omong kosong. Edit jawaban Anda hanya untuk memasukkan iconvperintah dan saya akan menandainya sebagai jawabannya.
Seyed Mohammad
1
Agar bebas dari pengaturan variabel LANG, orang dapat melakukan: iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txtyang saya uji dan bekerja. Jadi mungkin ide yang baik untuk mengedit perintah Anda seperti ini.
Seyed Mohammad
Saya menulis skrip yang berguna berdasarkan perintah kerja yang telah saya jelaskan di jawaban lain di sini. Saya harap ini akan membantu pengguna Linux Persia lainnya karena sangat membantu saya.
Seyed Mohammad
@karel: Terima kasih, "mengeluh" adalah kata kerja - frasa ini ditulis secara ungrammatis.
Incnis Mrsi
1

Selain itu iconv, yang merupakan alat yang sangat berguna baik sendiri atau dalam skrip, ada solusi yang sangat sederhana yang saya temukan mencoba untuk mencari tahu masalah yang sama untuk rangkaian karakter Yunani (Windows-1253 + ISO-8859-7).

Yang perlu Anda lakukan adalah membuka file teks melalui dialog "Open" Gedit dan bukan dengan mengklik dua kali . Di bagian bawah kotak dialog ada drop-down untuk Pengkodean, yang diatur ke "Terdeteksi Secara Otomatis" . Ubah ke "Windows-125x" atau kumpulan kode lain yang sesuai dan teks akan dapat dibaca dengan sempurna di Gedit. Anda kemudian dapat menyimpannya menggunakan pengkodean UTF-8, hanya untuk memastikan Anda tidak akan memiliki masalah yang sama lagi di masa depan ...

Giorgos_tph
sumber
1

Sebagai solusi pelengkap untuk masalah ini, saya telah menyiapkan skrip Bash yang berguna berdasarkan iconvperintah dari jawaban 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

Simpan skrip ini sebagai fix-encoding.sh, berikan izin eksekusi menggunakan chmod +x fix-encoding.shdan gunakan seperti ini:

./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub

Skrip ini akan mencoba memperbaiki penyandian sejumlah file yang disediakan sebagai input. Perhatikan bahwa file akan diperbaiki di tempat, sehingga konten akan ditimpa.

Sayyid Mohammad
sumber
Anda tidak perlu mengeluarkan $ file dari "  ...  " karena variabel diperluas dengan tanda kutip ganda serta dalam teks terbuka. Hanya '$ file' yang akan diterjemahkan secara harfiah, dengan tanda dolar, dengan bash.
Incnis Mrsi
Seperti yang saya sebutkan sebagai jawaban atas jawaban yang diposting oleh 'Incnis Mrsi', solusi itu gagal berfungsi dan begitu pula skrip ini.
Seyed Mohammad
1

Saya tidak tahu apakah ini bekerja dengan Farsi: Saya menggunakan Gedit, ini memberikan kesalahan dengan pengkodean yang salah, dan saya dapat memilih apa yang ingin saya terjemahkan ke UTF-8, itu hanya teks yang tidak menyala format, tapi di sini ada tangkapan layar !

masukkan deskripsi gambar di sini

Maaf saya akhirnya dapat melalui file teks saya, jadi sekarang semuanya sudah dikonversi.

Saya juga menyukai notepad ++, masih ketinggalan.

Ken Mollerup
sumber
Gedit tidak dapat memperbaiki masalah. Meskipun Gedit tidak menunjukkan kesalahan penyandian untuk file saya, bahkan ketika itu tidak dapat memperbaikinya. Saya juga mencoba "save as" dengan pengkodean UTF-8 di Gedit, tetapi tidak memperbaiki masalah.
Seyed Mohammad
1

Jika Anda suka bekerja di GUI daripada CLI, seperti yang saya lakukan:

  1. Buka file dengan Geany (editor)
  2. Buka menu File -> Reload as
  3. Pilih pengkodean yang diasumsikan untuk mengubah omong kosong menjadi karakter yang dapat diidentifikasi dalam bahasa Anda. Misalnya, untuk membaca kapal selam Yunani saya akan memuat ulang sebagai Eropa Barat -> Yunani (Windows-1253)
  4. Buka menu Dokumen > Setel Pengkodean -> Unicode -> UTF-8
  5. Menyimpan
Christos
sumber
Tidak bekerja ..
Aurimas
0

Solusi kerja yang saya temukan adalah menggunakan editor teks Microsoft Visual Studio Code yang merupakan Freeware dan tersedia untuk Linux.

Buka file yang ingin Anda konversi enkode dalam VS-Code. Di bagian bawah jendela, ada beberapa tombol. Salah satunya terkait dengan pengkodean file, seperti yang ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Mengklik tombol ini akan memunculkan menu overhead yang mencakup dua item. Dari menu ini pilih opsi "Buka kembali dengan Pengkodean", seperti di bawah ini:

masukkan deskripsi gambar di sini

Ini akan membuka menu lain yang mencakup daftar penyandian yang berbeda, seperti yang ditunjukkan di bawah ini. Sekarang pilih "Bahasa Arab (Windows 1256)":

masukkan deskripsi gambar di sini

Ini akan memperbaiki teks omong kosong seperti ini:

masukkan deskripsi gambar di sini

Sekarang klik lagi tombol encoding dan kali ini pilih opsi "Save with Encoding", seperti di bawah ini:

masukkan deskripsi gambar di sini

Dan di menu baru pilih opsi "UTF-8":

masukkan deskripsi gambar di sini

Ini akan menyimpan file yang diperbaiki menggunakan pengkodean UTF-8:

masukkan deskripsi gambar di sini

Selesai! :)

Sayyid Mohammad
sumber
Mencoba "Simpan dengan penyandian 'tetapi ini menunjukkan penyandian sebelumnya, dalam kasus saya UTF8
chaitanya