Solucionar os problemas de codificação de caracteres (Parte I – Apache)

Os problemas de codificação de caracteres (charset) são muito comuns e nos tempos de hoje ainda se vê muitas páginas com este tipo de problemas.

Em teoria para solucionar este tipo de problemas é bastante fácil Se trabalhamos com UTF-8, então todos os ficheiros e comunicações devem de se realizar com este tipo de codificação de caracteres.

No entanto, na prática isto é bem mais difícil de implementar e se perde muitas vezes horas tentando buscar boas soluções.

Apesar de ser um tema complexo, tentarei explicar da maneira mais simples algumas soluções que a mim me parecem interessantes e as melhores para solucionar este tipo de problemas.

No entanto, caso tenham dúvidas sobre alguma explicação ou queiram aportar as vossas soluções/ideias, podem sempre usar os comentários.

Tinha referido que todos os ficheiros e comunicações devem de se realizar com este tipo de codificação de caracteres, portanto, implica que quando pedimos dados ao servidor Apache, PHP ou MySQL estes enviem a respectiva informação no mesmo formato.

Sendo assim vou dividir este post em varias partes e abordar por separado cada secção.

Por regra, trabalho sempre com o formato mais abrangente e universal de caracteres, portanto utilizo UTF-8 como codificação de caracteres nos meus projectos.

Vamos passar da teoria à prática e vamos com um exemplo simples. Uma página estática em formato UTF-8 sobre servidor Apache.

Abrimos Notepad e escrebemos os seguinte codigo html:

< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt" lang="pt">

<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <title>Charset</title>
</head>

<body>
  <div>Exemplo simples de codificação de caracteres (charset)</div>
  <div>á é í ó ú à è ì ò ù ä ë ï ö ü ¡ ¿ ñ</div>
</body>

</html>

Gravámos o documento como charset.htm sem mudar a opção “Codificação:” que devia estar como ANSI.

Subimos ao servidor e testamos ou se querem como é html simples podem executar directamente no vosso navegador preferido (Firefox).

Resultado:
Charset ANSI

Como podem ver, saí uns caracteres muito esquisitos porque temos o ficheiro em formato ANSI, mas estamos a dizer ao navegador que os caracteres que temos no código deviam ser UTF-8. Portanto o navegador vai ler os caracteres ANSI como se fossem UTF-8 gerando estes caracteres esquisitos.

Editamos o respectivo ficheiro em Notepad e seleccionamos “Gravar como…”. Mantemos o mesmo nome de ficheiro e em “Codificação:” alteramos para “UTF-8″.

Subimos novamente ao servidor e testamos ou se querem como é html simples podem executar directamente no vosso navegador preferido (Firefox).

Resultado:
Charset UTF8

Agora os caracteres saíram como queríamos, porque estamos a dizer ao navegador que os caracteres que temos no código são UTF-8 e como o respectivo ficheiro já esta guardado com esta codificação, então não existe problemas de interpretação.

Se usamos os formatos ISO-8859-1 ou ISO-8859-15 (outros formatos para português), o nosso ficheiro deveria de estar em ANSI e deveríamos usar uma destas meta tags no nosso código html:

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="content-type" content="text/html; charset=iso-8859-15" />

Se estamos sobre servidor Apache isto só é assim caso a codificação de caracteres em Apache esteja em modo automático.

Apache tem uma directiva chamada AddDefaultCharset que indica qual é a codificação de caracteres que os ficheiros devem usar e alguns dos servidores a definem como:

AddDefaultCharset UTF-8

Isto significa que todos os ficheiros devem estar no formato UTF-8.

Neste caso se usa os formatos ISO-8859-1 ou ISO-8859-15 o nosso ficheiro deveria de estar em UTF-8 e não em ANSI (exemplo anterior) porque o servidor Apache só vai ler correctamente ficheiros com o formato UTF-8. No entanto, as meta tags não sofriam alterações:

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="content-type" content="text/html; charset=iso-8859-15" />

O recomendável é que esta directiva esteja desactivada para funcionar em modo automático. Isto é, detectar automaticamente a codificação de caracteres do ficheiro.

AddDefaultCharset Off

Esta directiva pode ser modificada através do ficheiro de configuração do servidor Apache (httpd.conf) ou através do ficheiro individual de configuração (.htaccess).

NOTA: Devemos reiniciar o servidor Apache quando se modifique algumas das directivas do ficheiro de configuração (httpd.conf).

Na próxima secção falaremos da codificação de caracteres sobre PHP.

Um Comentário a “Solucionar os problemas de codificação de caracteres (Parte I – Apache)”

  1. [...] Solucionar los problemas de codificación de caracteres en Apache, PHP y MySQL http://www.setpointer.com/blog/apache/solucionar-os-problemas-de-co…&nbsp; por Pardalito hace 2 segundos [...]

Comentar