Menentukan pengodean teks dalam PHP, bukan mb_detect_encoding

Ada beberapa pengkodean karakter alfabet Cyrillic.

Saat membuat situs di Internet biasanya menggunakan:

  • utf-8
  • windows-1251
  • koi8-r

Pengkodean lebih populer:

  • iso-8859-5
  • ibm866
  • mac-cyrillic

Ini mungkin bukan seluruh daftar, ini adalah pengkodean yang sering saya temui.

Terkadang menjadi perlu untuk menentukan pengkodean teks. Dan di PHP bahkan ada fungsi untuk ini:

mb_detect_encoding 

Tapi, seperti yang dituliskan oleh m00t dalam artikel Mendefinisikan Penyandian Teks dalam PHP - Tinjauan Solusi yang Ada plus Sepeda Lain
Singkatnya, itu tidak berfungsi.
Setelah membaca artikel m00t, saya tidak terinspirasi oleh metodenya dan menemukan solusi ini: Menentukan pengkodean teks dalam PHP dan Python
Seperti yang saya katakan
lagi kode karakter
Saya menguji fungsi menentukan pengkodean dengan kode karakter, hasilnya memuaskan saya dan saya menggunakan fungsi ini selama beberapa tahun.

Baru-baru ini saya memutuskan untuk menulis ulang proyek tempat saya menggunakan fungsi ini, saya menemukan paket yang sudah jadi di packagist.org cnpait / detect_encoding , di mana pengkodean ditentukan menggunakan metode m00t

Pada saat yang sama, paket yang ditentukan diinstal lebih dari 1200 kali, yang berarti bukan hanya untuk saya saja tugas menentukan pengkodean teks muncul secara berkala.

Saya akan menginstal paket ini dan tenang, tetapi saya memutuskan untuk "bingung."

Secara umum, saya membuat paket saya: onnov / detect-encoding .

Cara menggunakannya ditulis dalam README.md

Saya akan menulis tentang mengujinya dan membandingkannya dengan paket cnpait / detect_encoding .

Metodologi pengujian


Ambil teks besar: Tolstoy - Anna Karenina
Total - 1'701'480 karakter

Kami menghapus semua yang tidak perlu, kami hanya meninggalkan alfabet Cyrillic:

 $text = preg_replace('/[^--]/ui', '', $text); 

Masih ada 1'336'252 tanda-tanda cyrillic.

Dalam loop, kami mengambil bagian dari teks (5, 15, 30, ... karakter), mengonversinya menjadi penyandian yang diketahui dan mencoba menentukan penyandian dengan skrip. Kemudian bandingkan dengan benar atau tidak.

Berikut adalah tabel di mana pengkodean di sebelah kiri, jumlah karakter yang olehnya pengkodean ditentukan di atas, tabel menunjukkan hasil keandalan dalam %%
surat ->5153060120180270
windows-125199.1398.8398,5499,0499,7399,93100.0
koi8-r99,8999,98100.0100.0100.0100.0100.0
iso-8859-581.7999.2799,98100.0100.0100.0100.0
ibm86699.8199,99100.0100.0100.0100.0100.0
mac-cyrillic12,7947.4973.4892.1599,3099,94100.0

Akurasi terburuk dengan Mac Cyrillic, Anda memerlukan setidaknya 60 karakter untuk menentukan pengodean ini dengan akurasi 92,15%. Pengkodean Windows-1251 juga memiliki akurasi yang sangat rendah. Hal ini disebabkan oleh fakta bahwa jumlah karakter mereka dalam tabel tumpang tindih.

Untungnya, penyandian mac-cyrillic dan ibm866 tidak digunakan untuk menyandikan halaman web.

Mari kita coba tanpanya:
surat ->510153060
windows-125199.4099,6999,8699,97100.0
koi8-r99,8999,9899,98100.0100.0
iso-8859-581.7996.4199.2799,98100.0

Keakuratan tekadnya tinggi bahkan dalam kalimat pendek dari 5 hingga 10 huruf. Dan untuk frasa 60 huruf, akurasi penentuan mencapai 100%. Namun, pengodeannya ditentukan dengan sangat cepat, misalnya, teks yang lebih panjang dari 1.300.000 karakter Sirilik diperiksa dalam 0,00096 detik. (di komputer saya)

Dan hasil apa yang akan ditunjukkan oleh metode statistik yang dijelaskan oleh m00t :
surat ->510153060
windows-125188.7596.6298.4399,90100.0
koi8-r85.1595,7197.9699,91100.0
iso-8859-588.6096.7798,5899,93100.0

Seperti yang Anda lihat, hasil dari menentukan encoding itu bagus. Kecepatan naskah tinggi, terutama dalam teks pendek, dalam teks besar kecepatannya jauh lebih rendah. Teks yang lebih panjang dari 1.300.000 karakter Cyrillic diperiksa dalam 0,32 detik. (di komputer saya).

Temuan saya


  • Kedua metode ini memberikan hasil yang baik.
  • Keakuratan metode dekat.
  • Kecepatan menentukan oleh kode karakter lebih tinggi dalam teks besar, tetapi ini hampir tidak penting, karena tidak mungkin ada orang yang akan memeriksa teks yang begitu besar.
  • Metode statistik masih memiliki potensi untuk meningkatkan akurasi penentuan pengkodean.

Metode mana yang digunakan terserah Anda. Pada prinsipnya, Anda bisa menggunakan keduanya sekaligus.

Source: https://habr.com/ru/post/id466113/


All Articles