Cara terbaik untuk mengonversi file teks antar set karakter?

526

Apa alat atau metode tercepat, termudah untuk mengonversi file teks antara set karakter?

Secara khusus, saya perlu mengkonversi dari UTF-8 ke ISO-8859-15 dan sebaliknya.

Semuanya berjalan: satu-baris dalam bahasa skrip favorit Anda, alat baris perintah atau utilitas lain untuk OS, situs web, dll.

Solusi terbaik sejauh ini:

Di Linux / UNIX / OS X / cygwin:

  • Gnu iconv disarankan oleh Troels Arvin paling baik digunakan sebagai filter . Tampaknya tersedia secara universal. Contoh:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    Seperti yang ditunjukkan oleh Ben , ada konverter online menggunakan ikonv .

  • Gnu recode ( pengguna ) disarankan oleh Cheekysoft akan mengkonversi satu atau beberapa file di tempat . Contoh:

    $ recode UTF8..ISO-8859-15 in.txt
    

    Yang ini menggunakan alias lebih pendek:

    $ recode utf8..l9 in.txt
    

    Recode juga mendukung permukaan yang dapat digunakan untuk mengkonversi antara berbagai jenis dan penyandian akhir baris:

    Ubah baris baru dari LF (Unix) ke CR-LF (DOS):

    $ recode ../CR-LF in.txt
    

    File encode Base64:

    $ recode ../Base64 in.txt
    

    Anda juga bisa menggabungkannya.

    Mengonversi file UTF8 yang disandikan Base64 dengan ujung garis Unix ke file Latin 1 yang disandikan Base64 dengan ujung garis Dos:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

Di Windows dengan Powershell ( Jay Bazuzi ):

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (Tidak ada dukungan ISO-8859-15; ia mengatakan bahwa rangkaian karakter yang didukung adalah unicode, utf7, utf8, utf32, ascii, bigendianunicode, default, dan oem.)

Edit

Apakah maksud Anda dukungan iso-8859-1? Menggunakan "String" melakukan ini misalnya untuk sebaliknya

gc -en string in.txt | Out-File -en utf8 out.txt

Catatan: Nilai enumerasi yang dimungkinkan adalah "Tidak Dikenal, String, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii".

Antti Sykäri
sumber
Saya mencoba gc -en Ascii readme.html | Out-File -en UTF8 readme.htmltetapi mengkonversi file ke utf-8 tetapi kemudian kosong! Notepad ++ mengatakan file tersebut berformat Ansi tetapi membaca seperti yang saya mengerti itu bahkan bukan charset yang valid ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE
2
Temukan ini mencari jawaban untuk pertanyaan terkait - ringkasan yang bagus! Hanya berpikir itu layak menambahkan yang recodeakan bertindak sebagai filter juga jika Anda tidak memberikannya nama file, misalnya:recode utf8..l9 < in.txt > out.txt
Jez
iconv.com/iconv.htm tampaknya sudah mati untuk saya? (batas waktu)
Andrew Newby
2
Jika Anda menggunakan enca, Anda tidak perlu menentukan pengkodean input. Hal ini sering cukup hanya untuk menentukan bahasa: enca -L ru -x utf8 FILE.TXT.
Alexander Pozdneev
1
Sebenarnya, iconv bekerja lebih baik sebagai konverter di tempat daripada filter. Mengonversi file dengan lebih dari 2 juta baris menggunakan iconv -f UTF-32 -t UTF-8 input.csv > output.csvhanya sekitar tujuh ratus ribu baris yang disimpan, hanya sepertiga. Menggunakan versi in-place yang iconv -f UTF-32 -t UTF-8 file.csvberhasil dikonversi semua 2 juta baris plus.
Nicolay77

Jawaban:

246

Pendekatan utilitas yang berdiri sendiri

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

Anda tidak harus menentukan argumen ini. Mereka akan default ke lokal Anda saat ini, yang biasanya UTF-8.

Troels Arvin
sumber
4
Bagi siapa pun yang tersandung oleh versi non-dash yang tidak tersedia, sepertinya versi OSX (dan mungkin semua BSD) dari ikonv tidak mendukung alias non-dash untuk berbagai pengkodean UTF- *. iconv -l | grep UTFakan memberi tahu Anda semua penyandian terkait UTF yang didukung oleh ikonv Anda.
coredumperror
14
Tidak tahu penyandian file input Anda? Gunakan chardet in.txtuntuk menghasilkan tebakan terbaik. Hasilnya dapat digunakan sebagai ENCODING di iconv -f ENCODING.
Stew
4
Mencegah keluar di karakter yang tidak valid (menghindari illegal input sequence at positionpesan), dan mengganti "aneh" karakter dengan karakter "mirip": iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt.
knb
Saya suka ini karena standar pada kebanyakan platform NIX. Tapi juga melihat opsi perintah VIM (alias: ex) di bawah . Info tambahan: (1) Anda (mungkin) tidak perlu menentukan opsi -f(dari) dengan iconv. (2) file --mime-encoding <file/s>perintah ini dapat membantu Anda mengetahui pengkodean di tempat pertama.
fr13d
1
FWIW fileperintah melaporkan sumber saya sebagai UTF-16 Little Endian; menjalankan iconv -f UTF-16 -t UTF-8...mengubahnya salah ke ASCII, saya harus secara eksplisit menentukan iconv -f UTF-16LE...untuk output UTF-8
Plato
90

Coba VIM

Jika sudah, vimAnda dapat menggunakan ini:

Tidak diuji untuk setiap pengkodean.

Bagian keren dari ini adalah Anda tidak perlu tahu sumber enkode

vim +"set nobomb | set fenc=utf8 | x" filename.txt

Perlu diketahui bahwa perintah ini memodifikasi file secara langsung


Bagian penjelasan!

  1. +: Digunakan oleh vim untuk langsung memasukkan perintah saat membuka file. Biasanya digunakan untuk membuka file pada baris tertentu:vim +14 file.txt
  2. |: Pemisah beberapa perintah (seperti ;dalam bash)
  3. set nobomb : tidak ada utf-8 BOM
  4. set fenc=utf8: Atur pengodean baru ke utf-8 doc link
  5. x : Simpan dan tutup file
  6. filename.txt : path ke file
  7. ": qotes ada di sini karena pipa. (Jika tidak, bash akan menggunakannya sebagai pipa bash)
Boop
sumber
Cukup keren, tapi agak lambat. Apakah ada cara untuk mengubah ini untuk mengkonversi sejumlah file sekaligus (sehingga menghemat biaya inisialisasi vim)?
DomQ
Terima kasih atas penjelasannya! Saya mengalami kesulitan dengan awal file sampai saya membaca tentang pengaturan bom / bangsawan.
jjwdesign
1
np, tambahannya Anda dapat melihat bom jika Anda menggunakan vim -batauhead file.txt|cat -e
Boop
1
misalnya:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Gabriel
Saya menggunakan ini untuk mengkonversi pengkodean file CSV dan sangat senang ketika saya melihat charset memang berubah. Sayangnya, ketika saya pergi untuk memuat file ke MySQL, ia memiliki jumlah kolom yang berbeda dari yang sebelumnya sebelum menjalankan perintah vim. Bertanya-tanya apakah mungkin untuk hanya membuka file, mengkonversi encoding, dan menyimpan / menutup file sambil meninggalkan semua konten file lainnya sama?
NightOwlPrgmr
39

Di Linux Anda dapat menggunakan perintah pengodean ulang yang sangat kuat untuk mencoba dan mengonversi antara rangkaian karakter yang berbeda serta masalah garis akhir.recode -l akan menunjukkan kepada Anda semua format dan pengkodean yang dapat dikonversi oleh alat. Ini mungkin daftar yang SANGAT panjang.

Cheekysoft
sumber
Bagaimana cara Anda mengonversi LF? Ada /CRdan /CR-LFtetapi tidak ada/LF
Aaron Franke
21

iconv (1)

iconv -f FROM-ENCODING -t TO-ENCODING file.txt

Juga ada alat berbasis iconv dalam banyak bahasa.

Daniel Papasian
sumber
1
Bagaimana dengan mendeteksi otomatis penyandian asli?
Aaron Franke
20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

Versi terpendek, jika Anda dapat mengasumsikan bahwa BOM input benar:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt
Jay Bazuzi
sumber
1
Inilah versi yang lebih pendek yang berfungsi lebih baik. gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Larry Battle
@LarryBattle: Bagaimana cara Set-Contentkerjanya lebih baik daripada Out-File?
Jay Bazuzi
... oh Saya kira mereka hal yang hampir sama. Saya mengalami kesulitan menjalankan contoh Anda karena saya berasumsi bahwa kedua versi menggunakan file-utf8.txtfile yang sama untuk input karena keduanya memiliki file output yang sama file-utf7.txt.
Larry Battle
Ini akan sangat hebat, kecuali bahwa itu tidak mendukung UTF16. Ini mendukung UTF32, tetapi tidak UTF16! Saya tidak perlu mengkonversi file, kecuali bahwa banyak perangkat lunak Microsoft (fe SQL server bcp) bersikeras pada UTF16 - dan kemudian utilitas mereka tidak akan dikonversi ke sana. Menarik untuk dikatakan.
Noah
Saya mencoba gc -en Ascii readme.html | Out-File -en UTF8 readme.htmltetapi mengkonversi file ke utf-8 tetapi kemudian kosong! Notepad ++ mengatakan file tersebut berformat Ansi tetapi membaca seperti yang saya mengerti itu bahkan bukan charset yang valid ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE
16

Coba ikonv fungsi Bash

Saya telah memasukkan ini ke dalam .bashrc:

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

..untuk dapat mengonversi file seperti:

utf8 MyClass.java
Arne Evertsson
sumber
8
lebih baik menggunakan tmp = $ (mktmp) untuk membuat file sementara. Selain itu, garis dengan rm berlebihan.
LMZ
1
dapatkah Anda melengkapi fungsi ini dengan mendeteksi otomatis format input?
mlibre
3
Hati-hati, fungsi ini menghapus file input tanpa memverifikasi bahwa panggilan ikonv berhasil.
philwalk
Ini mengubah isi file teks. Saya menjalankan ini pada UTF-8 dengan BOM mengharapkan untuk keluar UTF-8 tanpa file BOM, tapi itu diawali pada awal file.
Aaron Franke
14

Coba Notepad ++

Pada Windows saya dapat menggunakan Notepad ++ untuk melakukan konversi dari ISO-8859-1 ke UTF-8 . Klik "Encoding"dan kemudian "Convert to UTF-8".

Jeremy Glover
sumber
13

Oneliner menggunakan find, dengan deteksi set karakter otomatis

Pengkodean karakter dari semua file teks yang cocok terdeteksi secara otomatis dan semua file teks yang cocok dikonversi ke utf-8pengkodean:

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

Untuk melakukan langkah-langkah ini, sub shell shdigunakan dengan -exec, menjalankan satu-kapal dengan -cbendera, dan melewati nama file sebagai argumen posisi "$1"dengan -- {}. Di antaranya, utf-8file output dinamai sementara converted.

Dimana file -biartinya:

  • -b, --brief Jangan tambahkan nama file ke saluran keluaran (mode singkat).

  • -i, --mime Menyebabkan perintah file untuk menampilkan string tipe mime daripada yang lebih mudah dibaca manusia. Jadi bisa dikatakan misalnya text/plain; charset=us-asciibukan ASCII text. The sedpemotongan perintah ini hanya us-asciisebagai diperlukan oleh iconv.

The findPerintah ini sangat berguna untuk otomatisasi manajemen file tersebut. Klik di sini untuk lebih findberlimpah .

Serge Stroobandt
sumber
3
Saya harus mengadaptasi solusi ini sedikit agar dapat bekerja di Mac OS X, setidaknya pada versi saya. find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
Brian J. Miller
1
Kode Anda berfungsi pada Windows 7 dengan MinGW-w64 (versi terbaru) juga. Terima kasih telah membagikannya!
silvioprog
@rmuller sedPerintah ada di sana dengan sengaja, memungkinkan deteksi otomatis pengkodean karakter. Saya telah memperluas jawaban untuk menjelaskan ini sekarang. Akan sopan sehubungan dengan pembaca untuk menghapus komentar yang tidak relevan yang tersisa. Terima kasih.
Serge Stroobandt
@SergeStroobandt Mungkin saya tidak cukup jelas. Maksud saya adalah ketika Anda menggunakan "file -b --mime-encoding" bukan "file -bi" tidak perlu untuk menyaring hasil dengan sed. Perintah ini sudah mengembalikan hanya penyandian file. Jadi, dalam contoh Anda "us-ascii"
rmuller
Ini sebenarnya tidak melakukan apa pun untuk saya di Linux. Saya menyimpan file sebagai UTF-8 dengan BOM dan berharap untuk mengkonversi ke UTF-8 tanpa BOM dan tidak.
Aaron Franke
3

PHP iconv ()

iconv("UTF-8", "ISO-8859-15", $input);

pengguna15096
sumber
1
Pernyataan ini berfungsi baik saat mengonversi string, tetapi tidak untuk file.
jjwdesign
2

DOS / Windows: gunakan halaman Kode

chcp 65001>NUL
type ascii.txt > unicode.txt

Perintah chcpdapat digunakan untuk mengubah halaman kode. Halaman kode 65001 adalah nama Microsoft untuk UTF-8. Setelah mengatur halaman kode, output yang dihasilkan oleh perintah berikut akan menjadi set halaman kode.

lalthomas
sumber
1

untuk menulis file properti (Java) biasanya saya menggunakan ini di linux (distribusi mint dan ubuntu):

$ native2ascii filename.properties

Sebagai contoh:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

PS: Saya menulis Eksekusi nomor satu / dua di portugues untuk memaksa karakter khusus.

Dalam kasus saya, dalam eksekusi pertama saya menerima pesan ini:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

Ketika saya menginstal opsi pertama (gcj-5-jdk) masalahnya selesai.

Saya harap ini membantu seseorang.

Maciel Bombonato
sumber
0

Alat favorit saya untuk ini adalah Jedit (editor teks berbasis java) yang memiliki dua fitur yang sangat nyaman:

  • Salah satu yang memungkinkan pengguna memuat ulang teks dengan penyandian berbeda (dan, dengan demikian, mengontrol hasil secara visual)
  • Satu lagi yang memungkinkan pengguna untuk secara eksplisit memilih pengkodean (dan akhir baris karakter) sebelum menyimpan
yota
sumber
0

Cukup ubah penyandian file yang dimuat di IntelliJ IDEA IDE, di sebelah kanan bilah status (bawah), di mana charset saat ini ditunjukkan. Ini meminta untuk Muat Ulang atau Konversi, gunakan Konversi. Pastikan Anda membuat cadangan file asli terlebih dahulu.

Nikolai Varankine
sumber
0

Jika aplikasi macOS GUI adalah roti dan mentega Anda, SubEthaEdit adalah editor teks yang biasanya saya tuju untuk penguraian pengkodean - "pratinjau konversi" memungkinkan Anda untuk melihat semua karakter yang tidak valid dalam pengkodean keluaran, dan memperbaiki / menghapusnya.

Dan sekarang open-source , jadi yay untuk mereka 😉.

tiennou
sumber