Ada banyak file teks biasa yang dikodekan dalam rangkaian varian.
Saya ingin mengonversikan semuanya menjadi UTF-8, tetapi sebelum menjalankan ikonv, saya perlu mengetahui penyandian aslinya. Sebagian besar browser memiliki Auto Detect
opsi dalam penyandian, namun, saya tidak dapat memeriksa file teks itu satu per satu karena ada terlalu banyak.
Hanya setelah mengetahui pengodean asli, saya kemudian dapat mengonversi teks dengan iconv -f DETECTED_CHARSET -t utf-8
.
Apakah ada utilitas untuk mendeteksi penyandian file teks biasa? TIDAK HARUS 100% sempurna, saya tidak keberatan jika ada 100 file yang salah dikonversi dalam 1.000.000 file.
python-chardet
dalam repo alam semesta Ubuntu.chardet
masih akan memberikan tebakan yang paling benar./a.txt: GB2312 (confidence: 0.99)
. Dibandingkan dengan Enca yang baru saja gagal dan melaporkan 'Pengodean tidak dikenal'. Namun, sayangnya,chardet
berjalan sangat lambat.chardet <(head -c4000 filename.txt)
jauh lebih cepat dan sama-sama sukses untuk kasus penggunaan saya. (kalau-kalau tidak jelas sintaks bash ini hanya akan mengirimkan 4000 byte pertama ke chardet)chardet==3.0.4
, dan nama yang dapat dieksekusi alat baris perintah sebenarnyachardetect
tidakchardet
.Saya akan menggunakan perintah sederhana ini:
Atau jika Anda ingin hanya set karakter aktual (seperti
utf-8
):sumber
file
hanya mendeteksi pengkodean dengan properti tertentu, seperti UTF-8 atau UTF-16. Sisanya - ISO8859 tua atau koresponden MS-DOS dan Windows - terdaftar sebagai "tidak diketahui-8bit" atau yang serupa, bahkan untuk file yangchardet
mendeteksi dengan 99% kepercayaan.Pada Linux berbasis Debian, paket uchardet ( Debian / Ubuntu ) menyediakan alat baris perintah. Lihat di bawah deskripsi paket:
sumber
uchardet
melalui Homebrew.iconv
berfungsi dengan baik.Untuk Linux, ada enca dan untuk Solaris Anda dapat menggunakan auto_ef .
sumber
enca -d -L zh ./a.txt
gagal dengan pesan./a.txt: Unrecognized encoding Failure reason: No clear winner.
Seperti yang disebutkan @grawity,chardet
lebih longgar, namun terlalu lambat.Mozilla memiliki basis kode yang bagus untuk deteksi otomatis di halaman web:
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/
Penjelasan terperinci dari algoritma:
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
sumber
Kembali ke chardet (python 2.?) Panggilan ini mungkin cukup:
Meskipun jauh dari sempurna ....
sumber
Bagi mereka yang secara teratur menggunakan Emacs, mereka mungkin menemukan hal-hal berikut yang berguna (memungkinkan untuk memeriksa dan memvalidasi secara manual transfomasi).
Selain itu saya sering menemukan bahwa deteksi otomatis char-set Emacs jauh lebih efisien daripada alat deteksi otomatis char-set lainnya (seperti chardet).
Kemudian, panggilan sederhana ke Emacs dengan skrip ini sebagai argumen (lihat opsi "-l") melakukan pekerjaan.
sumber
UTFCast patut dicoba. Tidak bekerja untuk saya (mungkin karena file saya mengerikan) tetapi terlihat bagus.
http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/
sumber
isutf8
(darimoreutils
paket) melakukan pekerjaansumber
Juga jika Anda mengajukan -i memberi Anda diketahui
Anda dapat menggunakan perintah php ini yang dapat menebak charset seperti di bawah ini:
Di php Anda dapat memeriksa seperti di bawah ini:
Menentukan daftar penyandian secara eksplisit:
" Mb_list_encodings " lebih akurat :
Di sini, di contoh pertama, Anda dapat melihat bahwa saya meletakkan daftar penyandian (deteksi urutan daftar) yang mungkin cocok. Untuk mendapatkan hasil yang lebih akurat, Anda dapat menggunakan semua kemungkinan penyandian melalui: mb_list_encodings ()
Catatan fungsi mb_ * membutuhkan php-mbstring
Lihat jawaban: https://stackoverflow.com/a/57010566/3382822
sumber