Solucionar os problemas de codificação de caracteres (Parte II – PHP)

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:

< !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.php e alteremos a opção “Codificação:” para UTF-8.

Subimos este ficheiro ao servidor e testamos (Requisitos: Apache + PHP).

Resultado:
Exemplo PHP ISO-8859-1

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:
Exemplo PHP UTF-8

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:

<?php header('Content-Type: text/html; charset=UTF-8'); ?>
< !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:
Exemplo PHP UTF-8

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.

Comentar