Agora que já funciona correctamente a codificação de caracteres das páginas estáticas (ler “Parte I – Apache“), vamos às páginas dinâmicas PHP.
PHP tem o seu próprio método de codificação de caracteres que vem configurado por definição como ISO-8859-1. Mesmo usando um ficheiro/script em UTF-8 com a meta tag definida para UTF-8, vai sair caracteres esquisitos.
Vamos à prática. Abrimos Notepad e escrevemos o seguinte código html:
<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.php e alteremos a opção “Codificação:” para UTF-8.
Subimos este ficheiro ao servidor e testamos (Requisitos: Apache + PHP).
Resultado:

Se a extensão deste ficheiro fosse “.htm”, não havia problemas de codificação de caracteres porque se tratava de uma página estática.
Mas como a extensão deste ficheiro é “.php” então se trata de uma página dinâmica PHP. Isto quer dizer que todo código HTML desta página é gerado pelo intérprete de PHP e não pelo servidor Apache.
Como o intérprete de PHP vem configurado por defeito como ISO-8859-1, este vai ler o ficheiro (em UTF-8) com uma codificação de caracteres errada gerando caracteres esquisitos.
No ficheiro de configuração de PHP, que tem como nome php.ini, existe duas directivas importantes para estes casos:
* default_mimetype
* default_charset
Para que não se limite o servidor a um determinado tipo de codificação de caracteres, vamos configurar estas duas directivas para que funcione com detenção automática Exactamente o que fizemos para o servidor Apache na “Parte I“.
Para isso devemos definir estas duas directivas com os seguintes valores:
* default_mimetype = “text/html”
* default_charset = “”
Deste modo, caso o ficheiro esteja em UTF-8 com as metas tags respectivas ou em outra codificação de caracteres valida, automaticamente o interprete PHP detecta a codificação de caracteres a usar e lê o ficheiro correctamente.
Resultado:

Para as pessoas que não possam alterar o ficheiro php.ini, por limitação de um determinado alojamento, sempre podem estabelecer uma cabeceira HTTP para pedir ao intérprete PHP que devolva a informação num determinado formato.
Exemplo:
< !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>
Analisem bem a primeira linha de código, porque é nesta linha que reside o segredo. Esta linha estabelece a cabeceira HTTP referida acima.
Resultado:

NOTA: Devemos reiniciar o servidor Apache quando se modifique algumas das directivas do ficheiro de configuração de PHP (php.ini).
Na próxima secção falaremos da codificação de caracteres sobre MySQL.