Hay varias codificaciones de caracteres del alfabeto cirílico.
Al crear sitios en Internet, usualmente utilizamos:
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 bicicletaEn 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 PythonComo dijo
m00tde 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
m00tAl 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 %%
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:
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 :
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.