Declarando encodings em XHTML

Eu já deixei aqui minha contribuição sobre quais as circunstâncias e quais os mime-types podem ser utilizados ao enviar o XHTML no texto “XHTML Media Types“. Se você ler poderá se livrar da culpa (se ela ainda existe) e enviar seu XHTML 1.0 como text/html (e não necessariamente como application/xhtml+xml), assim como a maioria dos documentos da própria W3C faz o uso do XHTML em seus próprios documentos (se você é um bom observador já deve saber disso). Mas se você resolver enviar seu XHTML como application/xhtml+xml, você deve incluir um passo a mais na forma como declara encodings nos seus documentos. Vamos ver como isso funciona passo-à-passo.

Qual a influência do mime-type?

Há algumas maneiras de informar aos user agents qual o encoding que deverá ser utilizado ao renderizar suas páginas para que você não venha a ter problemas presentes e futuros. Seja usando um mime type onde seu HTML ou XHTML será tratado como HTML puro (ou seja text/html), ou enviando seu XHTML como XML usando o mime-type xhtml+xml. A diferença entre os dois é que documentos de XHTML enviados como XML devem por recomendação conter uma declaração de XML acima do Doctype. Basicamente essa é a difença entre HTML e XHTML na hora de declarar seu encoding.

header HTTP

Utilize o parâmetro charset no content type header do HTTP que é enviado pelo servidor. Há várias formas de se fazer isso dependendo do servidor e da tecnologia que você usa. Você deve verificar qual a melhor maneira de fazer isso em cada contexto. O meu site por exemplo envia um content-type da seguinte maneira:

content-type: application/xhtml+xml; charset=utf-8

Deste modo, as configurações enviadas no header HTTP vão sempre prevalecer sobre as outras formas de declarar encodings, mas isso não exclui a necessidade de cumprir os passos seguintes.

Declaração de XML

Se for um XML que você está enviando (incluindo o XHTML quando enviado com o application/xhtml+xml mime-type), você deve usar o prolog de XML acima do seu doctype da seguinte maneira:

<?xml version="1.0" encoding="utf-8"?>

Meta Tag

Para o HTML e XHTML, independente do mime-type, utilize a meta tag http-equiv da seguinte maneira:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

É muito importante ressaltar que o header HTTP sobrepõe o encoding que você declara na meta tag e na declaração de XML, ou seja, essas três formas de declarar um encoding não são equivalentes. Os user agents vão considerar cada uma dessas formas de informar o encoding superior a outra da seguinte maneira.

Se nenhuma informação sobre o encoding não for enviada via header HTTP, o user agent vai passar a considerar a declaração de XML como a informação correta. Mas se alguma informação for enviada via header, ela vai sobrepor as formas seguintes de declaração. E se nem a declaração de XML for encontrada e nenhuma informação for enviada pelo header, a informação contida no HEAD do seu documento na forma de meta tag será utilizada para informar ao user agent, qual o encoding deve ser utilizado.

Verifique o que é enviado

Por isso é sempre bom saber qual o encoding que seu servidor está enviando para o browser antes de vasculhar seu HTML atrás de erros. Você pode verificar as informações sobre codificação de caracteres enviadas pelo HTTP de um documento, utilizando o Mozilla Web-Sniffer. O documento da W3C “The HTTP charset parameter” ensina como manipular as informações de encodings enviadas pelo seu servidor em diversas tecnologias. Não deixe de ler.

Sempre declare o encoding desejado, através do header HTTP e das declarações no seu documento em si. Se você não declarar as chances dos caracteres do seu site serem renderezidados incorretamente em um cliente ou outro são grandes.

Quirks Mode

A recomendação, é que as três formas de declarar o encoding seja utilizada em um documento de XHTML enviado com mime-type xhtml+xml e para o HTML não é necessário utilizar a declaração de XML acima do doctype. Se usar essa declaração, você deve saber das consequências disso, ao colocar seu documento no modo de renderização quirks e complicar sua vida. A melhor maneira é usar algo como um content-negotiation, para administrar o que é ou não enviado para o Internet Explorer. A não ser que você goste de se divertir desenvolvendo projeto em Quirks.

Referências

O que é quirks Mode: Post que eu escrevi sobre renderização quirks

Standards vs Quirks modes: Leia este interessante documento da W3C.

Content Type: texto muito interessante que eu encontrei no Lachy que dá algumas dicas sobre como tratar charsets no lado do servidor.

HTTP Head: Ferramenta da W3C para você poder ver o header que seu servidor envia aos user agentes e que também te permite verificar qual enconding seu servidor envia.

The HTTP charset parameter: Documento de leitura obrigatória para entender a fundo como ter o controle sobre como seu servidor transmite um charset.