Saya memiliki beberapa .htm
file yang terbuka di Gedit tanpa peringatan / kesalahan, tetapi ketika saya membuka file yang sama ini Jedit
, ia memperingatkan saya tentang pengkodean UTF-8 yang tidak valid ...
Tag meta HTML menyatakan "charset = ISO-8859-1". Jedit memungkinkan Daftar penyandian mundur dan Daftar pendeteksi otomatis penyandian (saat ini "BOM XML-PI"), jadi masalah langsung saya telah diselesaikan. Tapi ini membuat saya berpikir: Bagaimana jika meta data tidak ada di sana?
Ketika informasi pengkodean tidak tersedia, apakah ada program CLI yang dapat membuat "tebakan terbaik" yang mana pengkodean mungkin berlaku?
Dan, meskipun ini adalah masalah yang sedikit berbeda; apakah ada program CLI yang menguji validitas pengkodean yang dikenal ?
Jawaban:
The
file
perintah membuat "best-tebakan" tentang pengkodean. Gunakan-i
parameter untuk memaksafile
mencetak informasi tentang penyandian.Demonstrasi:
Inilah cara saya membuat file:
Sekarang semuanya utf-8. Tapi yakinkan diri Anda:
Bandingkan dengan https://en.wikipedia.org/wiki/Ä#Computer_encoding
Konversi ke penyandian lain:
Periksa hex dump:
Buat sesuatu yang "tidak valid" dengan mencampur ketiganya:
Apa yang
file
dikatakan:tanpa
-i
:The
file
perintah tidak memiliki gagasan tentang "valid" atau "tidak sah". Itu hanya melihat beberapa byte dan mencoba menebak apa pengkodean mungkin. Sebagai manusia, kita mungkin dapat mengenali bahwa file adalah file teks dengan beberapa umlaut dalam pengkodean "salah". Tetapi sebagai komputer itu akan membutuhkan semacam kecerdasan buatan.Orang mungkin berpendapat bahwa heuristik
file
adalah semacam kecerdasan buatan. Namun, bahkan jika itu, itu sangat terbatas.Berikut ini informasi lebih lanjut tentang
file
perintah: http://www.linfo.org/file_command.htmlsumber
, but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1.
file -i` yang dilaporkanunknown-8bit
. Jadi, ini juga tampaknya menjadi jawaban untuk: "Bagaimana mendeteksi pengkodean yang tidak valid / tidak dikenal"file -I
dengan huruf kapital 'i' bukan huruf kecil.Tidak selalu mungkin untuk mengetahui dengan pasti apa penyandian file teks. Misalnya, urutan byte
\303\275
(c3 bd
dalam heksadesimal) bisaý
dalam UTF-8, atauý
dalam latin1, atauĂ˝
dalam latin2, atau羸
dalam BIG-5, dan seterusnya.Beberapa pengkodean memiliki urutan byte yang tidak valid, jadi mungkin untuk mengesampingkannya. Ini benar khususnya pada UTF-8; sebagian besar teks dalam kebanyakan penyandian 8-bit tidak valid UTF-8. Anda dapat menguji UTF-8 yang valid dengan
isutf8
dari moreutils atau denganiconv -f utf-8 -t utf-8 >/dev/null
, antara lain.Ada alat yang mencoba menebak penyandian file teks. Mereka dapat membuat kesalahan, tetapi mereka sering bekerja dalam praktik selama Anda tidak sengaja mencoba membodohi mereka.
file
Encode::Guess
(bagian dari distribusi standar) mencoba penyandian berurutan pada string byte dan mengembalikan penyandian pertama di mana string adalah teks yang valid.Jika ada metadata (HTML / XML
charset=
, TeX\inputenc
, emacs-*-coding-*-
, ...) dalam file, editor tingkat lanjut seperti Emacs atau Vim sering dapat mengurai metadata itu. Itu tidak mudah untuk diotomatisasi dari baris perintah.sumber
iconv
, saya hanya menjalankan semua 1.168 pengodean (termasuk alias) yang terdaftar olehiconv -l
salah satu file .htm saya ... Ada 683 penyandian yang berhasil dihimpun .. Charset aktual file = ISO-8859-1 .. dibuat dari semua bar satu nilai kisaran ASCII .. Char non-ASCII adalah \ xA9.Juga jika Anda mengajukan -i memberi Anda tidak dikenal
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