Configurando a codificação de caracteres no .htaccess

Pergunta

Como eu uso as diretivas do .htaccess num servidor Apache para enviar arquivos com uma codificação específica?

Informações

É importante assegurar que qualquer informação sobre codificação de caracteres enviada pelo servidor esteja correta, tendo em vista que informação contida no cabeçalho HTTP se sobrepõe à informação contida no próprio documento.

Muitos servidores Apache são configurados para enviar arquivos usando a codificação ISO-8859-1 (Latin-1).Nos exemplos contidos neste FAQ, iremos partir do pressuposto que você deseja enviar seus arquivos utilizando uma codificação diferente da padrão em seu servidor. (Para dicas sobre qual codificação escolher consulte o tutorial Choosing & applying a character encoding.)

O exemplo a seguir mostra um exemplo de um cabeçalho HTTP que acompanha um arquivo enviado para um agente usuário (ex.: seu navegador). Nesse caso a informação sobre a codificação de caracteres é incluída no cabeçalho Content-Type na segunda linha de baixo para cima.

HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
Content-Location: CSS2-REC.en.html
Vary: negotiate,accept-language,accept-charset
TCN: choice
P3P: policyref=http://www.w3.org/2001/05/P3P/p3p.xml
Cache-Control: max-age=21600
Expires: Wed, 05 Nov 2003 16:46:04 GMT
Last-Modified: Tue, 12 May 1998 22:18:49 GMT
ETag: "3558cac9;36f99e2b"
Accept-Ranges: bytes
Content-Length: 10734
Connection: close
Content-Type: text/html; charset=utf-8
Content-Language: en

No exemplo o cabeçalho Content-Type expressa tanto o tipo MIME do arquivo quanto a codificação. O tipo MIME descreve o formato do arquivo sendo enviado. Arquivos HTML são tipicamente enviados como text/html. A codificação de caracteres (ou 'charset') do arquivo no exemplo é a UTF-8.

Para aprender como ver o cabeçalho HTTP de um arquivo consulte o artigo Checando cabeçalhos HTTP.

Arquivos num servidor Apache podem ser enviados com uma declaração padrão de charset no cabeçalho HTTP que conflita com a atual codificação do arquivo. A codificação de caracteres enviada pelo servidor pode ser o padrão definido na instalação, um padrão configurado pelo administrador do sistema, ou resultado de variadas diretivas no Apache. Em outros casos nenhuma informação sobre o charset é enviada pelo servidor quando é desejado.

Se o servidor está configurado para permitir que usuários ou administradores mudem a informação nos arquivos .htaccess, estes podem prover uma maneira de sobrescrever a configuração padrão do servidor. Esse FAQ irá lhe mostrar como.

Resposta

Existem alguns cenários diferentes que devem ser configurados. No primeiro por exemplo, você pode desejar modificar o padrão para todos os arquivos em um diretório com a mesma extensão. Ou você pode desejar mudar o padrão para um único arquivo ou um número pequeno de arquivos. Nós iremos explorar estes.

Em nossos exempos nós iremos assumir que a configuração de charset padrão do servidor é a ISO-8859-1, mas que você deseja que seu(s) arquivo(s) seja(m) enviado(s) utilizando a UTF-8 (uma boa estratégia!).

Essa resposta é relevante para você?

Esse artigo foi escrito tendo autores de conteúdo em mente, ao invés de administradores de sistema. Configurar a codificação padrão do servidor está além do escopo deste artigo.

Este artigo é relevante apenas se você estiver satisfeito em declarar o charset de seu documento via o cabeçalho HTTP. Em alguns casos você pode não querer isso.

Note que este FAQ também assume que seu servidor está configurado para usar arquivos .htaccess, assim como que as diretivas descritas abaixo funcionem nos arquivos .htaccess em seu servidor. Também é > assumido que não é apropriado simplesmente mudar a configuração padrão em seu servidor. Se você não tiver certeza, consulte o administrador de seu servidor.

Você também deve estar ciente das convençõs em uso em seu servidor para associação de informação de charset com extensões. Em alguns casos o servidor pode estar configurado tal que o charset a ser utilizado é indicado pela extensão do arquivo, ex.: exemplo.html.utf8 onde o .utf8 é que precisa ser associado com um charset, ao invés do .html (que pode ser associado com o tipo do arquivo).

Se estas formas falharem, você deve consultar o manual do Apache (veja a seção links) ou o administrador de seu servidor.

Especificando pela extensão

Use a diretiva AddCharset para associar o charset com todos os arquivos utilizando uma extensão em particular no diretório atual e seus sub-diretórios. Por exemplo, para enviar todos os arquivos com a extensão .html como UTF-8, abra o arquivo .htaccess num editor de texto puro e digite a seguinte linha:

AddCharset UTF-8 .html

A extensão pode ser especificada com ou sem o ponto(.) no início. Você pode adicionar múltiplas extensões na mesma linha. Isto irá funcionar també caso tenha arquivos tais como exemplo.pt.html ou exemplo.html.pt .

O exemplo irá fazer com que todos os arquivos com a extensão .html sejam enviados como UTF-8. O cabeçalho HTTP Content-Type irá conter uma linha que termina com a informação de charset como mostrado no exemplo abaixo.

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

Nota: Todos os arquivos com esta extensão em todos os sub-diretórios do diretório atual também serão enviados como UTF-8. Se, por algum motivo, você precisar enviar algum arquivo com uma codificação diferente você precisará sobrescrever esta configuração usando diretivas adicionais.

Nota: Você pode associar a codificação de caracteres com qualquer extensão presente em seu arquivo. Por exemplo, suponha que você tenha páginas em duas linguagens que seguem o modelo exemplificado: exemplo.en.html e exemplo.pt.html; Vamos supor também que você não tenha problemas em servir páginas em Inglês usando o padrão ISO-8859-1, porém deseja servir os arquivoes em português em UTF-8. Para fazer isso, você pode associar a codificação de caracteres com a extensão de linguagem, como no exemplo a seguir:

AddCharset UTF-8 .pt

Note que, se você puder, talvez seja uma solução melhor mudar o padrão do servidor para UTF-8, ou servir todos os arquivos em novos diretórios como UTF-8.

Nota: Também é possível obter o mesmo resultado usando a diretiva AddType , embora ela declare tanto a codificação de caracteres quanto o tipo MIME ao mesmo tempo. A decisão sobre qual método é o mais apropriado irá depender em parte em como você está usando extensões para negociação do conteúdo a ser servido. Se você está usando diferentes extensões para expressar o tipo de documento e a codificação de caracteres, essa método é menos provável de ser apropriado.

AddType 'text/html; charset=UTF-8' html 

Mudando o arquivo ocasional

Vamos assumir que você deseja servir apenas um arquivo como UTF-8 num grande diretório onde todos os outros antigos arquivos são servidos corretamente como ISO-8859-1. O arquivo que você deseja servir como UTF-8 é chamado exemplo.html; Abra o arquivo .htaccess num editor de texto puro e digite o seguinte:

<Files "example.html">
AddCharset UTF-8 .html
</Files>

O que nós fizemos aqui foi envolver a diretiva discutida na seção anterior em uma marcação que identifica o arquivo específico que nos interessa. Se você tiver a necessidade, existe também uma sintaxe um pouco diferente que permite que você especifique um número de nomes de arquivos usando uma expressão regular.

Nota: Também é possível obter o mesmo resultado usando a diretiva AddType mostrada acima, ou, nesse caso, a diretiva ForceType, embora estas declarem tanto o charset quanto o tipo MIME ao mesmo tempo.

<Files "example.html">
ForceType 'text/html; charset=UTF-8'
</Files>

Nota: Quaisquer arquivos com o mesmo nome em um subdiretório do diretório atual também serão enviados como UTF-8, a menos que você crie uma diretiva no diretório relevante.

Cenários mais complexos

Quando duas regras de extensão se aplicarem ao mesmo documento a ordem da extensão é importante. Portanto, no seguinte exemplo

AddCharset UTF-8 .utf8
AddCharset windows-1252 .html

O arquivo 'exemplo.utf8.html' será enviado como "windows-1252" e 'exemplo.html.utf8' como UTF-8.