2011-08-18 6 views
5

Sto analizzando molti siti. Tutto funziona bene, sto leggendo anche le dichiarazioni del charset per convertire le codifiche. Ora ho un problema con http://celleheute.de/sonntagsfuhrung-3/.Preferire la dichiarazione del set di caratteri nel metatag HTML o nell'intestazione HTTP?

Il meta tag HTML dice che il contenuto è codificato come ISO-8859-2, ma l'intestazione HTTP dice che è UTF-8. E in realtà, il contenuto è codificato in UTF, quindi quando il mio parser tenta di convertire il contenuto in ISO, si romperanno alcuni caratteri.

Ora la mia domanda è, quale dichiarazione dovrei preferire? Devo ignorare i meta tag, quando posso trovare la dichiarazione nell'intestazione HTTP o viceversa? Cosa farà la maggior parte dei browser web?

risposta

10

di capire che cosa i browser moderni fanno, si dovrebbe iniziare la lettura a http://dev.w3.org/html5/spec/parsing.html#determining-the-character-encoding

passaggi uno e due sono i più rilevanti per la questione. Dicono

  1. Se l'utente ha esplicitamente indicato l'agente utente che ignora codifica dei caratteri del documento con una codifica specifica, opzionalmente ritorno che codifica con la fiducia certa e interrompere queste passaggi.

  2. Se il livello di trasporto specifica una codifica, ed è supportata, ritorno che codifica con la fiducia certo, e cesserà questi passaggi.

il che significa che l'header HTTP reale ha la precedenza su tutto, tranne dell'utente su-ride.

Oltre a ciò può diventare complesso. Un byte order mark, ad esempio, può avere la precedenza sul meta tag.


UPDATE: Dal momento che questa risposta è stato scritto, le specifiche cambiato (circa la metà del 2012), in modo che il byte order mark ora prende la precedenza su HTTP.

3

Semplicemente non c'è una risposta a questo. L'autore della pagina ha commesso un errore dando informazioni contrastanti. Quale è corretto può anche essere deciso con un lancio di moneta.

In generale, preferirei l'intestazione HTTP come valore primario. Il meta tag è solo inteso come un ripiego in ogni caso. Se si desidera seguire qualsiasi logica, provare prima a decodificare il documento utilizzando il set di caratteri specificato nell'intestazione HTTP. Se ciò fallisce chiaramente, poiché alcuni byte non sono validi nella codifica data, riprova nel set di caratteri specificato nel metatag, se presente. Se fallisce ancora, tutte le scommesse sono disattivate.

Se nessuno dei due fallisce, ma le codifiche sono in conflitto, coinvolgere un umano o provare qualche analisi statica sul testo decodificato, che potrebbe dirvi quale è più probabile che sia corretta.

Problemi correlati