Definición de codificación de texto en PHP en lugar de mb_detect_encoding

Hay varias codificaciones de caracteres del alfabeto cirílico.

Al crear sitios en Internet, usualmente utilizamos:

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

Codificaciones más populares:

  • iso-8859-5
  • ibm866
  • mac-cirílico

Probablemente esta no sea la lista completa, estas son las codificaciones que a menudo encuentro.

A veces se hace necesario determinar la codificación del texto. Y en PHP incluso hay una función para esto:

mb_detect_encoding 

Pero, como escribió m00t en el artículo Definición de codificación de texto en PHP: una descripción general de las soluciones existentes más otra bicicleta
En resumen, no funciona.
Después de leer los artículos de m00t, no me inspiró su método y encontré esta solución: Determinar la codificación de texto en PHP y Python
Como dijo m00t
de nuevo códigos de caracteres
Probé la función de determinar la codificación por códigos de caracteres, el resultado me satisfizo y usé esta función durante un par de años.

Recientemente decidí volver a escribir el proyecto donde usé esta función, encontré un paquete listo en packagist.org cnpait / detect_encoding , en el que la codificación se determina utilizando el método m00t

Al mismo tiempo, el paquete especificado se instaló más de 1200 veces, lo que significa que no es solo para mí que surge periódicamente la tarea de determinar la codificación del texto.

Instalaría este paquete y me calmaría, pero decidí "confundirme".

En general, hice mi paquete: onnov / detect-encoding .

Cómo usarlo está escrito en README.md

Escribiré sobre probarlo y compararlo con el paquete cnpait / detect_encoding .

Metodología de prueba


Toma el texto grande: Tolstoi - Anna Karenina
Total: 1'701'480 caracteres

Eliminamos todo lo innecesario, dejamos solo el alfabeto cirílico:

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

Quedaban 1'336'252 signos cirílicos.

En el bucle, tomamos parte del texto (5, 15, 30, ... caracteres), lo convertimos a una codificación conocida e intentamos determinar la codificación mediante el script. Entonces compare correctamente o no.

Aquí está la tabla en la que la codificación está a la izquierda, el número de caracteres por el cual se determina la codificación en la parte superior, la tabla muestra el resultado de confiabilidad en %%
letras ->5 5153060 60120180270
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-cirílico12,7947,4973,4892.1599,3099,94100,0

La peor precisión con Mac Cyrillic, necesita al menos 60 caracteres para determinar esta codificación con una precisión del 92.15%. La codificación de Windows-1251 también tiene una precisión muy baja. Esto se debe al hecho de que los números de sus personajes en las tablas se superponen en gran medida.

Afortunadamente, las codificaciones mac-cirílica e ibm866 no se utilizan para codificar páginas web.

Probemos sin ellos:
letras ->5 510153060 60
windows-125199,4099,6999,8699,97100,0
koi8-r99,8999,9899,98100,0100,0
iso-8859-581,7996,4199,2799,98100,0

La precisión de la determinación es alta incluso en oraciones cortas de 5 a 10 letras. Y para frases de 60 letras, la precisión de la determinación alcanza el 100%. Y, sin embargo, la codificación se determina muy rápidamente, por ejemplo, el texto de más de 1.300.000 caracteres cirílicos se verifica en 0.00096 segundos. (en mi computadora)

Y qué resultados mostrará el método estadístico descrito por m00t :
letras ->5 510153060 60
windows-125188,7596,6298,4399,90100,0
koi8-r85,1595,7197,9699,91100,0
iso-8859-588,6096,7798,5899,93100,0

Como puede ver, los resultados de determinar la codificación son buenos. La velocidad del guión es alta, especialmente en textos cortos, en textos enormes la velocidad es significativamente inferior. El texto de más de 1,300,000 caracteres cirílicos se verifica en 0,32 segundos. (en mi computadora)

Mis hallazgos


  • Ambos métodos dan buenos resultados.
  • La precisión de los métodos está cerca.
  • La velocidad de determinación por códigos de caracteres es mayor en textos grandes, pero esto no es de gran importancia, porque Es poco probable que alguien verifique textos tan grandes.
  • El método estadístico todavía tiene el potencial de aumentar la precisión de la determinación de la codificación.

Qué método usar depende de usted. En principio, puede usar ambos a la vez.

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


All Articles