Pertanyaan Menebak pengkodean teks diwakili sebagai byte [] di Java


Mengingat array byte yang mewakili teks dalam beberapa pengkodean yang tidak dikenal (biasanya UTF-8 atau ISO-8859-1, tetapi tidak harus demikian), apa cara terbaik untuk mendapatkan tebakan untuk pengkodean yang paling mungkin digunakan (di Java)?

Perlu dicatat:

  • Tidak ada meta-data tambahan yang tersedia. Array byte secara harfiah adalah satu-satunya masukan yang tersedia.
  • Algoritma deteksi jelas tidak akan 100% benar. Jika algoritme benar di lebih dari katakanlah 80% dari kasus-kasus yang cukup baik.

32
2017-11-04 23:54


asal


Jawaban:


Metode berikut ini memecahkan masalah menggunakan juniversalchardet, yang merupakan port Java perpustakaan pendeteksian encoding Mozilla.

public static String guessEncoding(byte[] bytes) {
    String DEFAULT_ENCODING = "UTF-8";
    org.mozilla.universalchardet.UniversalDetector detector =
        new org.mozilla.universalchardet.UniversalDetector(null);
    detector.handleData(bytes, 0, bytes.length);
    detector.dataEnd();
    String encoding = detector.getDetectedCharset();
    detector.reset();
    if (encoding == null) {
        encoding = DEFAULT_ENCODING;
    }
    return encoding;
}

Kode di atas telah diuji dan berfungsi sebagai intented. Cukup tambahkan juniversalchardet-1.0.3.jar ke classpath.

Saya sudah menguji keduanya juniversalchardet dan jchardet. Kesan umum saya adalah juniversalchardet memberikan akurasi pendeteksian yang lebih baik dan API yang lebih baik dari dua perpustakaan.


29
2017-11-05 07:04



Ada juga Apache Tika - perangkat analisis konten. Itu bisa menebak tipe mime, dan itu bisa menebak pengkodean. Biasanya tebakan itu benar dengan probabilitas yang sangat tinggi.


4
2017-09-20 12:38



Inilah favorit saya: http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding

Ia bekerja seperti ini:

  • Jika ada UTF-8 atau UTF-16 BOM, kembalikan encoding itu.
  • Jika tidak ada byte yang memiliki bit set tingkat tinggi, kembalilah ASCII (atau Anda dapat memaksanya mengembalikan pengkodean 8-bit default).
  • Jika ada byte dengan set bit tinggi tetapi mereka diatur dalam pola yang benar untuk UTF-8, kembalikan UTF-8.
  • Jika tidak, kembalikan enkode default platform (misalnya, windows-1252 pada sistem Windows lokal-Inggris).

Mungkin kedengarannya terlalu sederhana, tetapi dalam pekerjaan sehari-hari saya lebih dari 90% akurat.


3
2017-11-05 12:46



Jawaban Chi tampaknya paling menjanjikan untuk penggunaan nyata. Saya hanya ingin menambahkan bahwa, menurut Joel Spolsky, Internet Explorer menggunakan algoritma menebak berbasis frekuensi pada zamannya:

http://www.joelonsoftware.com/articles/Unicode.html

Secara kasar, semua yang diasumsikan menjadi teks disalin, dan diuraikan dalam setiap penyandian yang bisa dibayangkan. Parse mana saja yang paling sesuai dengan profil kata rata-rata (dan huruf?) Frekuensi bahasa, menang. Saya tidak dapat dengan cepat melihat apakah jchardet menggunakan pendekatan yang sama, jadi saya pikir saya akan menyebutkan ini untuk berjaga-jaga.


1
2017-11-05 01:01



Periksa jchardet


0
2017-11-05 00:24



Seharusnya sudah tersedia

pencarian google muncul icu4j

atau

http://jchardet.sourceforge.net/


-1
2017-11-05 01:00



Tanpa indikator encoding, Anda tidak akan pernah tahu pasti. Namun, Anda bisa membuat beberapa tebakan cerdas. Lihat jawaban saya untuk pertanyaan ini,

Cara menentukan apakah String mengandung karakter yang dienkode tidak valid

Gunakan metode validUTF8 (). Jika kembali benar, perlakukan sebagai UTF8, sebaliknya sebagai Latin-1.


-1
2017-11-05 01:28