Como trabalhar com UTF8 em PHP + MySQL?
Bom, este é a minha primeira matéria referente ao desenvolvimento WEB.
Trabalho já a 3 anos, mas esses tempos tive problemas com caracteres latinos novamente, então busquei a forma real de trabalhar com eles.
Percebi que os sites da grande e poderosa Google, e outros também grandes como YAHOO! trabalham com a codificação UTF-8, mas pensei com meus botões… Porque?
Descobri que o UTF-8 tem o maior suporte a caracteres em relação aos outros, até porque trabalha de uma forma binária.
Então mandei logo o famoso:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Resultado? Ainda tive problemas.
Então fui pesquisar novamente e descobri a saÃda.
Pensei em passar absolutamente tudo para UTF-8. Mas a pergunta era… O que é este tudo?
Aprendi que os sistemas de arquivos dos sistemas operacionais trabalham também com codificação. Ubuntu em ext3 por exemplo também trabalha com o UTF-8.
Ou seja, quando criamos um arquivo, ele é criado com o charset padrão do sistema. O Windows possui um próprio, então achei uma opção interessante no notepad++, converter para utf-8 (SEM BOM) (Formatar > Converter para UTF-8 (SEM BOM), então ele irá salvar o arquivo na codificação UTF-8. :)
Simples, o arquivo já está em UTF-8 e o que faço no PHP?
Insiro no inicio da página esse cabeçalho:
header('Content-type:Â text/html;Â charset="utf-8"',true);
Mas somente isso não basta, as tabelas do banco de dados também devem estar em UTF-8, crie o banco de dados em utf8_bin, e verá que todas as tabelas que não forem definidas um charset e um collation, irão automaticamente ficar com utf8_bin nos campos de texto.
Mas não para por ai, ainda tem que definir a codificação da conexão com o banco de dados.
Se você usa uma conexão simples, um mysql_set_charset(‘utf8′) funciona, no caso de quem usa mysqli (como eu), você irá iniciar sua variável $mysqli e observar o seguinte objeto: $mysqli->set_charset(‘utf8′)
Meu arquivo de conexão ficou assim:
<?
# Efetuando a conexão com o banco de dados
$mysqli= new mysqli(’localhost’, ‘root’, ’senha’,'nome_banco’);
# Selecionando charset de conexão
$mysqli->set_charset(’utf8');
?>
Bom, para simplificar verifique sempre os passos seguintes:
1. Charset e collation do banco de dados e das tabelas que nele contém
2. Charset de conexão com o banco de dados
3. Arquivos sempre codificados em UTF-8 (dica é usar o notepad++ ou uma IDE como o Zend)
4. Enviar os cabeçalhos via HTML
5. Enviar os cabeçalhos também via PHP
E claro, não menos importante, verifique como está o seu arquivo .sql que irá importar para o banco de dados, ele também deve estar em utf-8.
Bom, é isso ai, desculpem talvez algum erro de português ou se não foi “entendÃvel” o suficiente, mas estou postando as 1:26am, hehe, vejo muitas pessoas com esse problema de codificação, então decidi escrever sobre minhas experiências com elas.
Qualquer dúvida envie um e-mail para michel@surrealartweb.com.br
Abraço e até a próxima.
Popularity: 100% [?]
8 comentários
Trackbacks e Pingbacks
-
[...] UTF-8 como PHP e MySQL By helderam Retirado de Surreal Art Web [...]
Deixe um comentário

Boa Michel,
Achei você pelo Google, e consegui irar minhas dúvidas.
Excelente tópico,
Abraço!
Parabéns pelo excelente tópico. Também encontrei seu site pelo Google, mas já o adicionei aos favoritos e sempre acessarei para conferir as últimas novidades e dar uma lida também nos conteúdos que você já postou.
Achei muito interessante sua dica sobre a conversão para o UTF-8, mas gostaria de ampliar um pouco mais essa discussão e perguntar: Qual a vantagem de se fazer um site na Internet em UTF-8 ao invés de ISO-8859-1?
No caso do Wordpress eu entendi perfeitamente sua explicação (e até com experiência própria), pois já tentei utilizar o wordpress em ISO e realmente dá vários problemas com acentos e caracteres especiais em geral não são exibidos corretamente nos navegadores, mas para sites estáticos ou que utilizam meus próprios sistemas dinâmicos, sempre desenvolvi em ISO-8859-1 (e no caso o banco de dados em latin) e nunca tive problemas com a codificação. Então, neste caso de desenvolvimento próprio, seria apenas uma preferência}?
Pois é Márcio, como colocado acima por você, em sistemas pessoais realmente pode ser uma preferência, porém, como não estudei muito a respeito de outras codificações não sei responder a esta questão, mas como mencionei acima no post, se grandes empresas que trabalham com diversas linguas utilizam, porque não seguir esse “padrão”? Sem falar que esses dias tive uma experiência um tanto interessante, porque coloquei acentos em pastas em ambiente Linux com sistemas de arquivos EXT3, e quando fui acessar pelo Windows, para a minha surpresa estava com aquele “problema de codificação” de UTF-8, hehe, teria que usar um utf8_decode(‘nome_da_pasta’) para ler… Ou seja, o Linux geralmente usa UTF-8 no sistemas de arquivos, contrário do Windows XP-, pois o vista parece estar já usando UTF-8.
Então, se os nossos serviços de hospedagem usam linux, para não ter problema, o mais indicado seria utilizar UTF-8 mesmo.
Alguém pode confirmar, mas Windows usa ISO-8859-1.
Abraço
Ótimo post meu amigo! Desatou um nó que estava na minha cabeça..ou melhor, no meu script! kkk
abraços!!
Muito bom! Eu ja tinha tentado de tudo, esse mysql_set_charset(‘utf8′); me salvou! hehe
valeu!
Obrigado pela dica:
header(‘Content-type: text/html; charset=”utf-8″‘,true);
ajudou-me a resolver um problema com codificação de caracteres no servidor da nossa escola.
Valeu mesmo cara. Vai me ajudar muito nos próximos trabalhos.