Mengkonversi file besar untuk penyandian

Jawaban:

36

Cygwin atau GnuWin32 menyediakan alat Unix seperti iconvdan dos2unix(dan unix2dos). Di bawah Unix / Linux / Cygwin, Anda akan ingin menggunakan "windows-1252" sebagai penyandian alih-alih ANSI (lihat di bawah). (Kecuali Anda tahu sistem Anda menggunakan codepage selain 1252 sebagai codepage default, dalam hal ini Anda harus memberi tahu ikonv tentang codepage yang tepat untuk diterjemahkan.)

Konversi dari satu ( -f) ke yang lain ( -t) dengan:

$ iconv -f windows-1252 -t utf-8 infile > outfile

Atau dalam bentuk find-all-and-conquer:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;

Kalau tidak:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;

Pertanyaan ini telah ditanyakan berkali-kali di situs ini, jadi inilah beberapa informasi tambahan tentang "ANSI". Dalam jawaban untuk pertanyaan terkait, CesarB menyebutkan :

Ada beberapa penyandian yang disebut "ANSI" di Windows. Faktanya, ANSI keliru . iconv tidak memiliki cara menebak yang Anda inginkan.

Pengkodean ANSI adalah pengodean yang digunakan oleh fungsi "A" di Windows API (fungsi "W" menggunakan UTF-16). Penyandian yang sesuai biasanya tergantung pada bahasa sistem Windows Anda. Yang paling umum adalah CP 1252 (juga dikenal sebagai Windows-1252). Jadi, ketika editor Anda mengatakan ANSI, itu berarti "apa pun fungsi API yang digunakan sebagai pengkodean ANSI default", yang merupakan pengkodean non-Unicode default yang digunakan dalam sistem Anda (dan dengan demikian biasanya yang digunakan untuk file teks).

Halaman yang dia tautkan untuk memberikan berita gembira historis ini (dikutip dari Microsoft PDF ) tentang asal-usul CP 1252 dan ISO-8859-1, pengkodean lain yang sering digunakan:

[...] ini berasal dari fakta bahwa kode Windows halaman 1252 pada awalnya didasarkan pada konsep ANSI, yang menjadi ISO Standar 8859-1. Namun, dalam menambahkan titik kode ke rentang yang disediakan untuk kode kontrol dalam standar ISO, halaman kode Windows 1252 dan halaman kode Windows berikutnya yang semula didasarkan pada seri ISO 8859-x yang menyimpang dari ISO. Hingga hari ini, tidak jarang komunitas pengembangan, baik di dalam maupun di luar Microsoft, mengacaukan halaman kode 8859-1 dengan Windows 1252, serta melihat "ANSI" atau "A" yang digunakan untuk menandakan dukungan halaman kode Windows .

quack quixote
sumber
4
Jangan gunakan nama file yang sama dengan input dan output! iconvtampaknya memotong file hingga 32.768 byte jika melebihi ukuran ini. Ketika dia menulis dalam file yang dia coba baca, dia berhasil melakukan pekerjaan itu jika file itu cukup kecil, kalau tidak, dia akan memotong file itu tanpa peringatan ...
Niavlys
1
FYI Pertanyaan ini ditandai dengan osx dan tidak terlihat bahwa salah satu dari perintah convert-all berfungsi pada Yosemite atau El Cap. Versi ikonv Apel kapal tidak mendukung --verbose atau -o, dan sintaks pengalihan stdout lainnya tidak berfungsi karena suatu alasan dan hanya mengirimkannya ke stdout biasa.
Scott McIntyre
28

dengan PowerShell Anda dapat melakukan sesuatu seperti ini:

%  get-content IN.txt | out-file -encoding ENC -filepath OUT.txt

sedangkan ENC adalah sesuatu seperti unicode, ascii, utf8, utf32. checkout 'help out-file'.

untuk mengonversi semua file * .txt dalam direktori ke utf8 lakukan sesuatu seperti ini:

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

yang membuat versi yang dikonversi dari setiap file .txt di DIR2.

EDIT: Untuk mengganti file di semua subdirektori gunakan:

% foreach($i in ls -recurse -filter "*.java") {
    $temp = get-content $i.fullname
    out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}
akira
sumber
Mengonversi dari ANSI ke UTF melalui proposal pertama Anda tidak menghapus seluruh konten file teks saya ...
Acroneos
@ Arconeos: maka Anda membuat kesalahan: file-in adalah IN.txt, file outfile adalah OUT.txt ... dengan cara ini tidak mungkin untuk menimpa yang asli. jika Anda menggunakan nama file yang sama untuk IN.txt dan OUT.txt maka Anda menimpa file yang Anda baca, tentu saja.
akira
Powershell akan dikonversi ke UTF dengan BOM. temukan dan ikon mungkin jauh lebih mudah.
pparas
6

Halaman Wikipedia pada baris baru memiliki bagian tentang utilitas konversi .

Ini tampaknya taruhan terbaik Anda untuk konversi dengan hanya menggunakan alat yang dikirimkan Windows dengan:

TYPE unix_file | FIND "" /V > dos_file
Nagul
sumber
3

UTFCast adalah konverter Unicode untuk Windows yang mendukung mode batch. Saya menggunakan versi berbayar dan cukup nyaman dengan itu.

UTFCast adalah konverter Unicode yang memungkinkan Anda mengonversi semua file teks menjadi pengkodean UTF hanya dengan satu klik mouse Anda. Anda dapat menggunakannya untuk mengonversi direktori yang penuh dengan file teks ke pengkodean UTF termasuk UTF-8, UTF-16 dan UTF-32 ke direktori output, sambil mempertahankan struktur direktori dari file asli. Bahkan tidak masalah jika file teks Anda memiliki ekstensi yang berbeda, UTFCast dapat secara otomatis mendeteksi file teks dan mengonversinya.

Tiler
sumber
Sepertinya mereka tidak dapat mengkonversi ke folder yang sama, hanya ke folder tujuan lain.
Uwe Keim
Versi pro memungkinkan konversi di tempat. $ 20/3 bulan. rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman
Oh, versi express (gratis) tidak berguna - hanya "Mendeteksi" utf-8 DENGAN BOM !! (semua orang bisa melakukan itu ). Hanya versi Pro yang Memperbarui Otomatis setiap 3 bulan dengan harga $ 20 per pop, akan mendeteksi secara otomatis. Harga mahal untuk pengguna non-perusahaan. DAN Waspadalah jika Anda mencoba versi dasar, dan file Anda sudah utf-8 (tanpa BOM), maka konverter ini akan mendeteksinya sebagai ASCII, kemudian (kembali) "mengonversi" ke utf-8, yang dapat mengakibatkan omong kosong . Waspadalah jika ini sebelum mencoba versi ekspres! Mereka memiliki versi demo untuk pro yang tidak menghasilkan keluaran - IMHO sia-sia karena tidak dapat memverifikasi hasil sebelum membeli!
SherylHohman
3

Oneliner menggunakan find, dengan deteksi otomatis

Pengkodean karakter dari semua file teks yang cocok akan 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 antara, utf-8file output dinamai sementara converted.

The findPerintah ini sangat berguna untuk otomatisasi manajemen file tersebut.

Klik di sini untuk lebih findberlimpah .

Serge Stroobandt
sumber
1

iconv -f original_charset -t utf-8 originalfile > newfile

jalankan perintah di atas untuk loop.

Aneesh Garg
sumber
0

Anda dapat menggunakan EncodingMaster . Ini gratis, memiliki versi Windows, Linux dan Mac OS X dan berfungsi dengan sangat baik.

Francisco Vera
sumber
1
Situs web yang Anda sebutkan ditutup.
Etienne Delavennat
0

Dalam kasus penggunaan saya, saya membutuhkan deteksi pengkodean input otomatis dan ada banyak file dengan Windows-1250pengkodean, yang perintahnya file -bi <FILE>kembali charset=unknown-8bit. Ini bukan parameter yang valid untuk iconv.

Saya mendapatkan hasil terbaik dengan enca .

Konversi semua file dengan ekstensi txt ke utf-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;
Bedla
sumber