2011-08-18 4 views
5

Estoy analizando muchos sitios. Todo funciona bien, estoy leyendo declaraciones de charset para convertir codificaciones. Ahora tengo un problema con http://celleheute.de/sonntagsfuhrung-3/.¿Prefiere la declaración del conjunto de caracteres en metaetiqueta HTML o encabezado HTTP?

La metaetiqueta HTML dice que el contenido está codificado como ISO-8859-2, pero el encabezado HTTP dice que es UTF-8. Y realmente, el contenido está codificado en UTF, así que cuando mi analizador intente convertir el contenido a ISO, romperá algunos caracteres.

Ahora mi pregunta es, ¿qué declaración debería preferir? ¿Debo ignorar las metaetiquetas, cuando puedo encontrar la declaración en el encabezado HTTP o viceversa? ¿Qué harán la mayoría de los navegadores web?

Respuesta

10

Para entender lo que hacen los navegadores modernos, usted debe comenzar a leer en http://dev.w3.org/html5/spec/parsing.html#determining-the-character-encoding

los pasos uno y dos son más relevantes para la pregunta. Dicen

  1. Si el usuario ha instruido de manera explícita el agente de usuario para anular codificación de caracteres del documento con una codificación específica, opcionalmente retorno que la codificación con el determinado nivel de confianza y abortar estos pasos.

  2. Si la capa de transporte especifica una codificación, y es compatible, devuelve esa codificación con la confianza cierta, y anule estos pasos .

lo que significa que la cabecera HTTP real tiene prioridad sobre todo excepto el usuario de anulación.

Más allá de eso, puede volverse complejo. Una marca de orden de bytes, por ejemplo, puede tener prioridad sobre la metaetiqueta.


ACTUALIZACIÓN: Ya que esta respuesta fue escrito, la especificación cambiado (a mediados de 2012) para que la marca de orden de bytes ahora tiene prioridad sobre la cabecera HTTP.

3

Simplemente no hay respuesta a esto. El autor de la página ha cometido un error al proporcionar información conflictiva. Cuál es el correcto también puede decidirse con un lanzamiento de moneda.

En general, preferiría el encabezado HTTP como el valor principal. La metaetiqueta solo significa un repliegue de todos modos. Si desea seguir cualquier lógica, intente decodificar el documento utilizando el juego de caracteres especificado en el encabezado HTTP. Si eso falla claramente, debido a que ciertos bytes no son válidos en la codificación dada, intente de nuevo en el conjunto de caracteres especificado en la metaetiqueta, si corresponde. Si eso aún falla, todas las apuestas están desactivadas.

Si ninguno falla pero las codificaciones entran en conflicto, involucre a un ser humano o intente realizar un análisis estadístico en el texto decodificado, que puede indicarle cuál es más probable que sea correcto.

Cuestiones relacionadas