Definieren der Textcodierung in PHP anstelle von mb_detect_encoding

Es gibt verschiedene Zeichenkodierungen des kyrillischen Alphabets.

Verwenden Sie beim Erstellen von Websites im Internet normalerweise Folgendes:

  • utf-8
  • Windows-1251
  • koi8-r

Beliebtere Codierungen:

  • ISO-8859-5
  • ibm866
  • mac-kyrillisch

Dies ist wahrscheinlich nicht die ganze Liste, dies sind die Kodierungen, denen ich oft begegne.

Manchmal ist es notwendig, die Kodierung des Textes zu bestimmen. Und in PHP gibt es dafür sogar eine Funktion:

mb_detect_encoding 

Aber wie m00t in dem Artikel Definieren der Textcodierung in PHP schrieb - Ein Überblick über vorhandene Lösungen und ein weiteres Fahrrad
Kurz gesagt, es funktioniert nicht.
Nachdem ich die m00t- Artikel gelesen hatte, ließ ich mich nicht von der Methode inspirieren und fand diese Lösung: Bestimmen der Textcodierung in PHP und Python
Wie m00t sagte
wieder Zeichencodes
Ich habe die Funktion zum Bestimmen der Codierung durch Zeichencodes getestet, das Ergebnis hat mich zufriedengestellt und ich habe diese Funktion einige Jahre lang verwendet.

Kürzlich habe ich beschlossen, das Projekt, in dem ich diese Funktion verwendet habe, neu zu schreiben. Auf packagist.org habe ich ein fertiges Paket gefunden. Cnpait / detect_encoding , in dem die Codierung mithilfe der m00t- Methode bestimmt wird

Gleichzeitig wurde das angegebene Paket mehr als 1200 Mal installiert, was bedeutet, dass nicht nur für mich die Aufgabe besteht, die Textcodierung regelmäßig zu bestimmen.

Ich würde dieses Paket installieren und mich beruhigen, aber ich beschloss, "verwirrt zu werden".

Im Allgemeinen habe ich mein Paket erstellt: onnov / detect-encoding .

Wie man es benutzt, ist in README.md geschrieben

Ich werde darüber schreiben, wie man es testet und mit dem Paket cnpait / detect_encoding vergleicht .

Testmethode


Nehmen Sie den großen Text: Tolstoi - Anna Karenina
Insgesamt - 1'701'480 Zeichen

Wir entfernen alles Unnötige, wir lassen nur das kyrillische Alphabet:

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

Es blieben 1'336'252 kyrillische Zeichen.

In der Schleife nehmen wir einen Teil des Textes (5, 15, 30, ... Zeichen), konvertieren ihn in eine bekannte Codierung und versuchen, die Codierung durch das Skript zu bestimmen. Dann richtig vergleichen oder nicht.

Hier ist die Tabelle, in der sich die Codierung links befindet, die Anzahl der Zeichen, anhand derer die Codierung oben bestimmt wird. Die Tabelle zeigt das Zuverlässigkeitsergebnis in %%
Buchstaben ->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-kyrillisch12.7947,4973,4892,1599,3099,94100,0

Bei der schlechtesten Genauigkeit mit Mac Cyrillic benötigen Sie mindestens 60 Zeichen, um diese Codierung mit einer Genauigkeit von 92,15% zu bestimmen. Die Windows-1251-Codierung weist ebenfalls eine sehr geringe Genauigkeit auf. Dies liegt an der Tatsache, dass sich die Nummern ihrer Zeichen in den Tabellen stark überschneiden.

Glücklicherweise werden mac-cyrillic- und ibm866-Codierungen nicht zum Codieren von Webseiten verwendet.

Versuchen wir es ohne sie:
Buchstaben ->510153060
Windows-125199,4099,6999,8699,97100,0
koi8-r99,8999,9899,98100,0100,0
ISO-8859-581,7996,4199,2799,98100,0

Die Genauigkeit der Bestimmung ist auch in kurzen Sätzen von 5 bis 10 Buchstaben hoch. Und für Sätze mit 60 Buchstaben erreicht die Bestimmungsgenauigkeit 100%. Die Kodierung wird jedoch sehr schnell ermittelt. Beispielsweise wird Text, der länger als 1.300.000 kyrillische Zeichen ist, in 0,00096 Sekunden überprüft. (auf meinem Computer)

Und welche Ergebnisse zeigt die von m00t beschriebene statistische Methode:
Buchstaben ->510153060
Windows-125188,7596,6298,4399,90100,0
koi8-r85,1595,7197,9699,91100,0
ISO-8859-588,6096,7798,5899,93100,0

Wie Sie sehen können, sind die Ergebnisse der Bestimmung der Codierung gut. Die Geschwindigkeit des Skripts ist hoch, insbesondere bei kurzen Texten, bei großen Texten ist die Geschwindigkeit erheblich geringer. Text, der länger als 1.300.000 kyrillische Zeichen ist, wird in 0,32 Sekunden überprüft. (auf meinem Computer).

Meine Erkenntnisse


  • Beide Methoden liefern gute Ergebnisse.
  • Die Genauigkeit der Methoden ist nah.
  • Die Geschwindigkeit der Bestimmung durch Zeichencodes ist in großen Texten höher, dies ist jedoch kaum von großer Bedeutung, da Es ist unwahrscheinlich, dass jemand so große Texte überprüft.
  • Das statistische Verfahren hat immer noch das Potenzial, die Genauigkeit der Codierungsbestimmung zu erhöhen.

Welche Methode Sie verwenden müssen, liegt bei Ihnen. Grundsätzlich können Sie beide gleichzeitig verwenden.

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


All Articles