Bagaimana saya bisa mengonversi file secara batch dalam direktori untuk encoding mereka (mis. ANSI-> UTF-8) dengan perintah atau alat?
Untuk file tunggal editor membantu, tetapi bagaimana melakukan pekerjaan file massal?
Bagaimana saya bisa mengonversi file secara batch dalam direktori untuk encoding mereka (mis. ANSI-> UTF-8) dengan perintah atau alat?
Untuk file tunggal editor membantu, tetapi bagaimana melakukan pekerjaan file massal?
Jawaban:
Cygwin atau GnuWin32 menyediakan alat Unix seperti iconv
dan 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 .
iconv
tampaknya 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 ...
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
}
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
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.
Pengkodean karakter dari semua file teks yang cocok akan terdeteksi secara otomatis dan semua file teks yang cocok dikonversi ke utf-8
pengkodean:
$ 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 sh
digunakan dengan -exec
, menjalankan satu-kapal dengan -c
bendera, dan melewati nama file sebagai argumen posisi "$1"
dengan -- {}
. Di antara, utf-8
file output dinamai sementara converted
.
The find
Perintah ini sangat berguna untuk otomatisasi manajemen file tersebut.
Klik di sini untuk lebih find
berlimpah .
iconv -f original_charset -t utf-8 originalfile > newfile
jalankan perintah di atas untuk loop.
Gunakan skrip Python ini: https://github.com/goerz/convert_encoding.py Ini berfungsi pada platform apa pun. Membutuhkan Python 2.7.
Ada dos2unix
di unix.
Ada alat serupa lainnya untuk Windows ( ref lain di sini ).
Bagaimana saya mengkonversi antara file teks Unix dan Windows? punya beberapa trik lagi
dos2unix
berguna untuk mengubah jeda baris , tetapi OP mencari konversi pengkodean karakter.
Anda dapat menggunakan EncodingMaster . Ini gratis, memiliki versi Windows, Linux dan Mac OS X dan berfungsi dengan sangat baik.
Dalam kasus penggunaan saya, saya membutuhkan deteksi pengkodean input otomatis dan ada banyak file dengan Windows-1250
pengkodean, 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' -- {} \;