Bagaimana cara mendeteksi penyandian file?

115

Pada sistem file saya (Windows 7) saya memiliki beberapa file teks (Ini adalah file skrip SQL, jika itu penting).

Ketika dibuka dengan Notepad ++ , di menu "Encoding" beberapa dari mereka dilaporkan memiliki encoding "UCS-2 Little Endian" dan beberapa "UTF-8 tanpa BOM".

Apa bedanya di sini? Semua itu tampaknya merupakan skrip yang benar-benar valid. Bagaimana saya bisa tahu pengkodean apa yang dimiliki file tanpa Notepad ++?

Marcel
sumber
7
Ada cara yang cukup sederhana menggunakan Firefox. Buka file Anda menggunakan Firefox, lalu View> Character Encoding. Detail di sini .
Catherine Gasnier
gunakan heuristik. checkout encadan chardetuntuk sistem POSIX.
Janus Troelsen
3
Saya pikir jawaban alternatifnya adalah TRIAL dan ERROR. iconvkhususnya berguna untuk tujuan ini. Pada dasarnya Anda mengulang string karakter yang rusak / teks melalui pengkodean yang berbeda untuk melihat mana yang bekerja. Anda menang, ketika karakter tidak lagi rusak. Saya ingin menjawab di sini, dengan contoh programatik. Namun sayangnya pertanyaan ini dilindungi.
Brandon Bertelsen
FF menggunakan Detektor Charset Mozilla . Cara sederhana lain adalah membuka file dengan kata MS, itu akan menebak file dengan cukup tepat bahkan untuk berbagai codepage Cina dan Jepang kuno
phuclv
Jika chardetatau chardetecttidak tersedia di sistem Anda, maka Anda dapat menginstal paket melalui manajer paket Anda (misalnya apt search chardet- di ubuntu / debian paket biasanya disebut python-chardetatau python3-chardet) atau melalui pip dengan pip install chardet(atau pip install cchardetuntuk versi c-dioptimalkan lebih cepat).
ccpizza

Jawaban:

97

File biasanya menunjukkan encoding mereka dengan header file. Ada banyak contoh di sini . Namun, bahkan membaca tajuk Anda tidak akan pernah bisa memastikan penyandian file apa yang sebenarnya digunakan .

Sebagai contoh, sebuah file dengan tiga byte pertama 0xEF,0xBB,0xBFadalah mungkin UTF-8 file disandikan. Namun, itu mungkin file ISO-8859-1 yang akan dimulai dengan karakter . Atau mungkin tipe file yang berbeda sama sekali.

Notepad ++ melakukan yang terbaik untuk menebak encoding file apa yang digunakan, dan sebagian besar waktu membuatnya benar. Kadang-kadang itu memang salah - karena itulah menu 'Pengkodean' itu ada, sehingga Anda dapat mengesampingkan tebakan terbaiknya.

Untuk dua penyandian yang Anda sebutkan:

  • File "UCS-2 Little Endian" adalah file UTF-16 (berdasarkan apa yang saya mengerti dari info di sini ) jadi mungkin dimulai dengan 0xFF,0xFE2 byte pertama. Dari apa yang saya tahu, Notepad ++ menggambarkannya sebagai "UCS-2" karena tidak mendukung aspek UTF-16 tertentu.
  • File "UTF-8 tanpa BOM" tidak memiliki byte header. Itulah arti bit "tanpa BOM".
vaughandroid
sumber
2
Mengapa file yang dimulai dengan BOM akan terdeteksi secara otomatis sebagai "UTF-8 tanpa BOM"?
Michael Borgwardt
2
Dan jika file dimulai dengan 0xFF, 0xFE itu harus dideteksi secara otomatis sebagai UTF-16, bukan UCS-2. UCS-2 mungkin ditebak karena berisi karakter terutama ASCII dan dengan demikian setiap byte lainnya adalah nol.
Michael Borgwardt
2
Dengan pengalaman, sayangnya, metadata ("header") juga bisa salah. Basis data yang menyimpan informasi bisa rusak, atau pengunggah yang asli bisa saja salah. (Ini telah menjadi masalah signifikan bagi kami dalam beberapa bulan terakhir; beberapa data diunggah sebagai "UTF-8" kecuali itu "benar-benar ISO8859-1, karena mereka benar-benar sama ?!" Bah! Para ilmuwan harus disimpan jauh dari asal-usul metadata; mereka hanya salah ...)
Donal Fellows
1
Sebenarnya saya pikir itu "lucu" bahwa masalah pengkodean masih tetap pada tahun 2014 karena tidak ada file di dunia akan dimulai dengan "ï» ¿"dan saya sangat terkejut ketika saya melihat halaman HTML yang telah dimuat dengan pengkodean yang salah. Ini masalah probabilitas. Tidak terpikirkan untuk memilih pengkodean yang salah jika pengkodean lain akan menghindari karakter aneh .. Mencari pengkodean yang menghindari karakter aneh akan bekerja pada 99,9999% kasus yang saya kira. Tapi masih ada kesalahan .. Juga itu pesan yang sangat membingungkan untuk menggunakan ascii daripada UTF8 untuk menghemat ruang .. membingungkan pengembang junior ide ini untuk melakukan ..
Revious
18

Kamu tidak bisa. Jika Anda bisa melakukannya, tidak akan ada begitu banyak situs web atau file teks dengan "omong kosong acak" di luar sana. Itu sebabnya pengkodean biasanya dikirim bersama dengan payload sebagai meta data.

Jika tidak, yang bisa Anda lakukan adalah "tebakan pintar" tetapi hasilnya sering ambigu karena urutan byte yang sama mungkin berlaku dalam beberapa penyandian.

Marco
sumber
2
OK, kalau begitu, apakah OS Windows menyimpan informasi (meta data) itu di suatu tempat? Dalam registri mungkin?
Marcel
Anda salah. Itu adalah codepages - tidak persis sama. Ada algoritma untuk menebak pada pengkodean Unicode.
DeadMG
6
@ Marscel: Tidak. Itu sebabnya "file teks" sangat bermasalah untuk apa pun kecuali ASCII murni.
Michael Borgwardt
well notepad ++ dapat melakukan ini, ini dapat memberi tahu Anda apakah file teks dikodekan utf-8 atau tidak
user25