Pregunta

Me gustaría para detectar la codificación de un texto (usando PHP). Para ello yo uso mb_detect_encoding función ().

El problema es que la función devuelve resultados diferentes si i cambiar el orden de las posibles codificaciones con la función mb_detect_order ().

Considere el ejemplo siguiente

$html = <<< STR
ちょっとのアクセスで落ちてしまったり、サーバー障害が多いレンタルサーバーを選ぶとあなたのビジネス等にかなりの影響がでてしまう可能性があります。特に商売をされている個人の方、法人の方は気をつけるようにしてください
STR;
mb_detect_order(array('UTF-8','EUC-JP', 'SJIS', 'eucJP-win', 'SJIS-win', 'JIS', 'ISO-2022-JP','ISO-8859-1','ISO-8859-2'));
$originalEncoding = mb_detect_encoding($str);
die($originalEncoding); // $originalEncoding = 'UTF-8'

Sin embargo, si se cambia el orden de las codificaciones en mb_detect_order () los resultados serán diferentes:

mb_detect_order(array('EUC-JP','UTF-8', 'SJIS', 'eucJP-win', 'SJIS-win', 'JIS', 'ISO-2022-JP','ISO-8859-1','ISO-8859-2'));        
die($originalEncoding); // $originalEncoding = 'EUC-JP'


Así que mis preguntas son:
¿Por qué es que eso ocurra?
¿Hay alguna manera en PHP para detectar correctamente y sin ambigüedades la codificación de texto?

¿Fue útil?

Solución

Eso es lo que se espera que suceda.

El algoritmo de detección probablemente sólo sigue tratando, en orden, las codificaciones que especificó en mb_detect_order y luego devuelve el primero de ellos en virtud del cual la corriente de bytes sería válida.

Algo más inteligente requiere métodos estadísticos (creo que el aprendizaje de máquina es de uso general).

EDIT: véase, por ejemplo este artículo para los métodos más inteligentes .

Debido a su importancia, la detección automática de juego de caracteres ya está implementado en las principales aplicaciones de Internet como Mozilla o Internet Explorer. Son muy preciso y rápido, pero la implementación se aplica muchos conocimientos específicos de dominio en base de caso por caso. A diferencia de sus métodos, el objetivo fue un simple algoritmo que puede ser aplicada de manera uniforme a cada juego de caracteres, y el algoritmo se basa en técnicas de aprendizaje de máquina bien establecidos, estándar. También se estudió la relación entre el lenguaje y la detección juego de caracteres, y los algoritmos basados ??en la comparación byte y algoritmos basados ??en caracteres. Utilizamos bayesiano (NB) y máquinas de vectores soporte (SVM).

Otros consejos

En realidad no. Las diferentes codificaciones a menudo tienen grandes áreas de superposición, y si la cadena que se está probando existe entirly el interior que se superponen, entonces tanto la codificación son aceptables.

Por ejemplo, UTF-8 y ISO-8859-1 son los mismos para las letras a-z. La cadena "Hola" tendría una secuencia idéntica de bytes en ambas codificaciones.

Esto es exactamente por qué hay una función mb_detect_order() en el primer lugar, ya que le permite decir lo que usted prefiere pasar cuando ocurren estos enfrentamientos. ¿Desea que "hola" a ser UTF-8 o ISO-8859-1?

Tenga en cuenta mb_detect_encoding() no sabe lo que es codificar los datos. Usted puede ver una cadena, pero la propia función sólo ve un flujo de bytes. A juzgar por eso, se tiene que adivinar cuál es la codificación es - por ejemplo, ASCII sería si bytes son sólo en el 0-127 gama, UTF-8 sería si existen bytes ASCII y 128+ bytes que sólo existen en pares o más, y así sucesivamente.

Como se puede imaginar, dado que el contexto, es muy difícil de detectar una codificación fiable.

Al igual que rihk Dicho esto, este es lo que la función es para mb_detect_order() - que está básicamente el suministro de su mejor conjetura lo que es probable que sean los datos. ¿Usted trabaja con archivos UTF-8 con frecuencia? Entonces es probable que su materia no es probable que sea UTF-16, incluso si mb_detect_encoding() podía imaginar como eso.

También puede ser que desee comprobar hacia fuera Artefacto 's enlace para una visión más en profundidad.

Ejemplo caso : Internet Explorer usos alguna codificación interesante conjeturar si no se especifica nada (@link, Sección: para detectar automáticamente el idioma de un sitio web ") que es causado comportamientos extraños en los sitios web que se llevaron a codificar por hecho en el pasado. Usted probablemente puede encontrar un poco de materia graciosamente en que si google alrededor. Se convierte en un buen vitrina cómo incluso métodos estadísticos puede ser contraproducente horriblemente, y por qué la codificación de adivinar, en general, es problemática.

mb_detect_encoding miradas en la primera entrada charset en su mb_detect_order () y luego se coloca a través de su entrada de $ html juego carácter por carácter que sea un carácter cae dentro del conjunto válido de caracteres para el juego de caracteres. Si todos los personajes coincide, entonces se devuelve true; si falla cualquier carácter, se mueve al siguiente juego de caracteres en el mb_detect_order () y lo intenta de nuevo.

La Wikipedia Lista de juegos de caracteres es un lugar bueno para ver los caracteres que componen cada charset.

Debido a que estos valores de conjunto de caracteres de superposición (char x8fA1EF existe tanto en 'UTF-8' y en 'EUC-JP') esto será considerado un partido a pesar de ser un personaje totalmente diferente en cada juego de caracteres. Así que a menos que cualquiera de los valores de caracteres existen en un conjunto de caracteres, pero no en otro, entonces mb_detect_encoding no puede identificar cuál de los conjuntos de caracteres no es válido; y devolverá el primer juego de caracteres de su lista de arreglo que podría ser válida.

Por lo que yo sé, no hay manera segura de identificar un conjunto de caracteres. método de "mejor estimación" de PHP puede ser ayudado si usted tiene una idea razonable de lo que los conjuntos de caracteres que es probable que encuentro, y ordenar su lista en consecuencia sobre la base de las lagunas (caracteres no válidos) en cada juego de caracteres. La mejor solución es "saber" el juego de caracteres. Si está raspando su html desde otra página, busca el identificador de juego de caracteres en la cabecera de la página.

Si realmente quiere ser inteligente, se puede tratar de identificar el idioma en el que está escrito el código HTML, tal vez usando trigramas o n-gramas o similar al descrito en este artículo en PHP / IR.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top