Problemas com a codificação UTF-8 em PHP

Enviado em 28/10/2008 10:30:51 por Alessandro Santos

Quando comecei a programar em PHP, não sabia muita coisa sobre codificações de caracteres e tudo mais. Aliás, não sei muita coisa até agora. Como todo bom usuário de Windows, tinha tudo pronto ali na minha frente e tudo rodava direitinho, até enviar os arquivos para um servidor Linux…

O grande problema começou quando comecei a usar por padrão a codificação Unicode, e a trabalhar direto com UTF-8. Logo na na primeira vez que chamei session_start(), apareceu a seguinte mensagem de erro:

Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at /var/www/teste.php:1) in /var/www/teste.php on line 2

O curioso de tudo é que o session_start() só retorna erro se alguma coisa tiver sido enviada para o cliente antes de chamar essa função, mas vamos dar uma olhada no código:
<?php
session_start();
?>

Observe bem, não existe nada antes do código. Mas será que não mesmo? Sabemos que o PHP trabalha nativamente com a codificação ISO-8859-1 e que até o momento não tem um suporte muito bom para Unicode (UTF-8). Então através do Quanta, vamos “emular” o arquivo como se ele estivesse sendo visto pelo PHP, transformando a codificação dos caracteres para ISO-8859-1 através do comando Tools - Encoding - Western European:
<?php
session_start();
?>

Bingo! Já descobrimos o que está sendo enviado para o navegador. Aqueles caracteres estranhos  são os responsáveis pelo problema. Mas… o que são eles?

Através de algumas pesquisas no Google, descobri que esses caracteres são uma espécie de assinatura do Unicode, chamada BOM, que é onde quero chegar e a solução de todos os nossos problemas envolvendo UTF-8 e PHP.

De acordo com esta página, a BOM consiste numa sequencia de caracteres no início dos dados recebidos pelo navegador/agente, a qual define a ordem dos bytes e a forma de codificação. (minha tradução mal-feita).

Segundo a mesma página, não é necessário utilizar a BOM quando se estiver codificando em UTF-8, afinal ele é mais indicado para UTF-16 e UTF-32. O UTF-8 pode ou não usar BOM. No nosso caso, para resolver esse problema com o PHP, devemos programar em arquivos UTF-8 sem BOM. Como fazer isso?

Bom, o Quanta, pelo que eu sei, já faz esse tipo de conversão automaticamente. Desde que migrei para o Ubuntu, só tenho utilizado ele e não tenho tido problemas com codificação de caracteres. Se você utiliza o Windows, recomendo um ótimo editor que eu utilizava quando desenvolvia no Windows: o Notepad++. Existem outros, é claro, e cada desenvolvedor escolhe o que é melhor para si. Não tenho certeza, mas parece que o Dreamweaver tem a opção de salvar sem BOM, mas quero me ater a indicar software livre por aqui.

Para finalizar, quero indicar uma leitura interessante sobre codificação UTF-8, que encontrei quando procurava a solução desse problema. Um artigo que se chama O Mínimo Absoluto Que Todo Desenvolvedor de Software Absolutamente, Positivamente Precisa Saber Sobre Unicode e Conjuntos de Caracteres (Sem Desculpas!). Boa leitura!