Configurando o parâmetro HTTP da codificação de caracteres (charset)

Quando um servidor envia um documento para um agente usuário (ex.: um navegador) ele também envia informações no campo "Content-Type" do cabeçalho HTTP sobre o tipo do formato do dado enviado. Essa informação é expressa utilizando-se um rótulo de tipo MIME. Esse artigo provê uma informação inicial para aqueles que necessitam configurar a informação de codificação de caracteres (N.T.: daqui em diante descrita por charset) a ser enviada no cabeçalho HTTP.

Você deve procurar em outro lugar por informações sobre como declarar a codificação de caracteres em páginas HTML, ou como descobrir a informação de codificação de caracteres que está sendo enviada num cabeçalho HTTP.

O parâmetro charset

Documentos transmitidos por meio do HTTP que são do tipo texto, tais como text/html, text/plain, etc., podem enviar um parâmetro charset no cabeçalho HTTP para especificar a codificação de caracteres a ser utilizada no documento.

É muito importante sempre rotular explicitamente documentos Web. O padrão HTTP 1.1 diz que o charset padrão é o ISO-8859-1. Porém existem muitos documentos não rotulados em outras codificações, por isso os navegadores(browsers) utilizam a codificação preferida do leitor quando não é definido um parâmetro charset.

A linha no cabeçalho HTTP tipicamente aparece desta forma:

Content-Type: text/html; charset=utf-8

Em teoria, qualquer codificação de caracteres que tenha sido registrada com a IANA pode ser utilizada, porém nenhum navegador entende todas. Quanto mais comum for a utilização de uma codificação de caracteres, mais chances do navegador entendê-la . Uma codificação Unicode tal como a UTF-8 é uma boa escolha por um número de razões.

Configuração no servidor

Como fazer o servidor enviar a informação charset apropriada depende do servidor utilizado. Você precisará ter permissão administrativa para poder mudar configurações no servidor.

Apache. A mudança pode ser feita utilizando-se as diretivas AddCharset (Apache 1.3.10 ou mais recente) ou AddType, para diretórios ou recursos individuais (arquivos). Com a AddDefaultCharset (Apache 1.3.12 ou mais recente), é possível configurar um charset padrão para todo o servidor. Para maiores informações, veja o artigo Configurando a informação de 'charset' no .htaccess.

Jigsaw. Use um indexer em JigAdmin para associar extensões com charsets, ou configure o charset diretamente em um "resource".

IIS 5 e 6. Na opção Gerenciador de Serviços Internet, clique com o botão direito em "Web Site Padrão" (ou no site o qual deseja configurar) e vá em "Propriedades" => "Cabeçalhos HTTP" => "Tipos de arquivos..." => "Novo tipo...". Coloque as extensões que deseja mapear, separadamente para cada extensão; Usuários IIS irão provavelmente quere mapear .htm, .html,... Então, para Tipo de Conteúdo, adicione "text/html;charset=utf-8" (sem as aspas; substitua o charset desejado por utf-8; não deixe nenhum espaço em nenhum lugar pois o IIS ignora todo texto após espaços). Para IIS 4, você pode ter que usar "Cabeçalhos HTTP" => "Criar um cabeçalho HTTP customizado" se os passos acima não funcionarem.

Modificando o cabeçalho no script

O cabeçalho apropriado pode ser configurado no código-fonte do script utilizado. Por exemplo:

Perl. Imprima o cabeçalho correto antes de qualquer outra parte da página. Após o último cabeçalho, utilize use uma quebra de linha (\n) dupla, ex.:
print "Content-Type: text/html; charset=utf-8\n\n";

Python. Use a mesma solução para Perl (exceto pelo fato do ponto-e-vírgula(;) ser desnecessário no fim da linha).

PHP. Use a função header() antes de enviar qualquer conteúdo da página, ex.:
header('Content-type: text/html; charset=utf-8');

Java Servlets. Use o método setContentType em ServletResponse antes de obter qualquer objeto (Stream ou Writer) utilizado para impressão de dados, ex.:
resource.setContentType ("text/html;charset=utf-8");
Se você utilizar um Writer, o Servlet automaticamente efetua a conversão das Strings para a codificação selecionada.

JSP. Use a diretiva page ex.:
<%@ page contentType="text/html; charset=UTF-8" %>
O envio de dados proveniente de out.println() ou de elementos de expresão (<%= object%>) é automaticamente convertido para a codificação selecionada. Também, a página é interpretada utilizando essa codificação.

ASP e ASP.Net. ContentType e charset são configurados independentemente, e são métodos do objeto de resposta. Para configurar o charset utilize:
<%Response.charset="utf-8"%>
Em ASP.Net, configurando o atributo Response.ContentEncoding irá configurar tanto o parâmetro charset no cabeçalho HTTP Content-Type quanto a codificação do documento sendo enviado (que obviamente tem que ser a mesma). O Padrão pode ser configurado no elemento globalization em Web.config (ou Machine.config, que é originalmente configurado para UTF-8).