Um dúvida muito recorrente em fóruns concerne a erros com acentuação, quando palavras como “atenção” são exibidas como “aten??o”. A solução é simples: padronizar as codificações de arquivos, do banco de dados e do HTML.
A melhor codificação a ser usada é a UTF-8, que suporta diversos idiomas, e tem sido adotada como codificação padrão em diversas aplicações.
E importante manter todas as codificações iguais, ou seja, todas em UTF-8. Para um site, é preciso atentar para as seguintes codificações:
Codificação do arquivo propriamente dito
É a codificação do arquivo dentro do sistema operacional. Ela pode ser modificada por meio do seu editor de textos. Por exemplo:
Exemplo de alteração de codificação no editor Gedit

Exemplo de alteração de codificação no editor Eclipse

Codificação do HTML
A codificação do HTML é definida por meio de meta tag ou da função header(), do PHP.
Definição por meio de meta tag:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Definição por meio da função header(), do PHP:
1 | header( 'Content-Type: text/html; charset=utf-8' ); |
Codificação do banco de dados e das tabelas
Se a sua aplicação usa um banco de dados, ele precisa, também, estar na codificação usada – UTF-8 no nosso caso. Ela é definida quando se criam o banco de dados e as tabelas. Por exemplo, com MySQL, podemos definir as codificação assim:
Codificação do banco de dados:
CREATE DATABASE bancodedados DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Codificação das tabelas:
CREATE TABLE tabela( id SMALLINT(5) UNSIGNED NOT NULL auto_incre3ment, nome VARCHAR(20) NOT NULL, sobrenome VARCHAR(50) NOT NULL, PRIMARY KEY (id) ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Assim, todos os campos do tipo string estarão na codificação utf8.
Problemas persistentes
Se você usava codificações diferentes, e, depois, modificou apenas a codificação do banco de dados, as acentuações, provavelmente, continuarão erradas. Não basta apenas mudar a codificação, nesse caso; será necessário passar os dados para outra tabela, que esteja, inicialmente, na codificação correta. É possível fazer essa transferência de dados por meio de apenas uma consulta. Para MySQWL, por exemplo, é possível usar um INSERT INTO… SELECT.







blz? cara vc poderia me ajudar,gravei um comando com um chip que grava rs232 entre a cpu e o periferico de destino do comando,mas entre os dois tem uma placa multiserial que estão conectados outros perifericos,tem como eu manda este comando atraves de um outro periferico sem que ele volte na cpu ou se passar mesmo que o sistema operacional der erro de leitura(é o que vai acontecer)esse comando va para o periferico de destino? ou seja usando outro periferico que esteja conectado a essa placa,é possivel?se puder me tire essa duvida.Obrigado.
Muito interessante e útil o post. Vou usar nos projetos futuros este padrão.
Olá Beraldo, boa tarde.
Sempre utilizei em meus projetos, bases de dados com charser latin1, a Collation latin1_swedish_ci e as páginas charset ISO-8859-1 e os processo de gravação, exibição e pesquisa sempre funcionaram corretamente. Iniciei um novo projeto, e nele pretendo passar a utilizar o UTF-8 como padrão. Criei a base de dados e as tabelas utilizando o charset utf-8 e collation utf8_general_ci. Se efetuo testes diretamente na base de dados para gravar ou buscar registros na base utilizando o phpmyadmin ou do mysql query browser, tudo funciona corretamente. Porém, quando executo uma inserção através de um formulário html (onde o charset da página e do header do php estão definidos para utf-8) as palavras acentuadas são gravadas no banco com caracteres estranhos. Ex: ‘acentuação’ -> ‘acentuação’.
O mais estranho é que visualizo o erro apenas quando efetuo a query diretamente no banco através do phpmyadmin ou do mysql query browser, porém, quando ela é executada através do browser os dados são exibidos corretamente.
Surge então um problema na pesquisa. Se o registro foi inserido pelo browser, sendo gravado ‘acentuação’, e caso haja uma busca onde o usuário do sistema procure a palavra ‘acentuacao’ sem utilizar os caracteres especiais o mySQL não retorna nada, mas caso ele busque ‘acentuação’, como foi gravado no banco, ele consegue retornar o registro.
Mas…. Caso eu grave o registro diretamente no banco utilizando o phpmyadmin ou o mysql query browser ele será gravado corretamente, da mesma forma como foi inserido, aí sim a busca funciona perfeitamente. No caso de termos gravado no banco a palavra ‘acentuação’ e buscarmos ‘acentuacao’, ‘acao’, ‘cão’ ele me retorna o registro corretamente.
Com este quadro pergunto??? Onde estou errando??? Tendo o arquivo, o browser e o banco completamente em utf-8, pode o PHP estar influenciando este problema??
Desde já agradeço.
Gabriel Haase
@Gabriel Haase
Verifique a codificação do arquivo, como mostrei postando imagens do GEdit e do Eclipse. Se a mata tag/header() está correto, o problema está na codificação do arquivo (definida no editor de textos)
Olá Caro Beraldo,
gostei de suas explicações e por isso venho contacta-lo,
pois estou com estes problemas, e fiz conforme tudo o que vc expos, mas não estou conseguindo solucionar…
refiz minha base baseada na sua…
reeditei as pages tudo esta com UTF-8 como desde o principio estou trabalhando.
preciso de sua ajuda por gentileza!
forte abraço!
consegui resolver com esse exemplo a maior parte dos problemas…
$testo =utf8_decode( $_POST['testo']);
$sql = (“INSERT INTO tbl_latim (testo) VALUES (‘$testo’)”);
mysql_query($sql) or die (mysql_error());
para exbir
$query = mysql_query(“SELECT * FROM tbl_latim”);
while($array = mysql_fetch_array($query,MYSQL_ASSOC)){
echo “id:“.$array['id'].”";
echo “Testo:“.htmlentities($array['testo']).”";
echo “”;
}
porém a recepção com o htmlentities fica, por exemplo [á - ã] e não gosto disso devido o SEO…
sem o htmlentities, o retorno do banco de dado vem “�”…
enviar para o banco de dados esta blz… ele recebe com acentuação, porém a recepção na pagina (q esta UTF-8) não é agradável…
pode me ajudar?
Olá mais uma vez…
achei um jeito de resolver… se vc souber de algo melhor me avisa por favor….
meu jeito:
function translate_Html($str) {
$str = htmlentities($str);
$quote[] = "Á";
$translate[] = "Á";
$quote[] = "á";
$translate[] = "á";
$quote[] = "Â";
$translate[] = "Â";
$quote[] = "â";
$translate[] = "â";
$quote[] = "À";
$translate[] = "À";
$quote[] = "à";
$translate[] = "à";
$quote[] = "Å";
$translate[] = "Å";
$quote[] = "å";
$translate[] = "å";
$quote[] = "Ã";
$translate[] = "Ã";
$quote[] = "ã";
$translate[] = "ã";
$quote[] = "Ä";
$translate[] = "Ä";
$quote[] = "ä";
$translate[] = "ä";
$quote[] = "Æ";
$translate[] = "Æ";
$quote[] = "æ";
$translate[] = "æ";
$quote[] = "É";
$translate[] = "É";
$quote[] = "é";
$translate[] = "é";
$quote[] = "Ê";
$translate[] = "Ê";
$quote[] = "ê";
$translate[] = "ê";
$quote[] = "È";
$translate[] = "È";
$quote[] = "è";
$translate[] = "è";
$quote[] = "Ë";
$translate[] = "Ë";
$quote[] = "ë";
$translate[] = "ë";
$quote[] = "Ð";
$translate[] = "Ð";
$quote[] = "ð";
$translate[] = "ð";
$quote[] = "Í";
$translate[] = "Í";
$quote[] = "í";
$translate[] = "í";
$quote[] = "Î";
$translate[] = "Î";
$quote[] = "î";
$translate[] = "î";
$quote[] = "Ì";
$translate[] = "Ì";
$quote[] = "ì";
$translate[] = "ì";
$quote[] = "Ï";
$translate[] = "Ï";
$quote[] = "ï";
$translate[] = "ï";
$quote[] = "Ó";
$translate[] = "Ó";
$quote[] = "ó";
$translate[] = "ó";
$quote[] = "Ô";
$translate[] = "Ô";
$quote[] = "ô";
$translate[] = "ô";
$quote[] = "Ò";
$translate[] = "Ò";
$quote[] = "ò";
$translate[] = "ò";
$quote[] = "Ø";
$translate[] = "Ø";
$quote[] = "ø";
$translate[] = "ø";
$quote[] = "Õ";
$translate[] = "Õ";
$quote[] = "õ";
$translate[] = "õ";
$quote[] = "Ö";
$translate[] = "Ö";
$quote[] = "ö";
$translate[] = "ö";
$quote[] = "Ú";
$translate[] = "Ú";
$quote[] = "ú";
$translate[] = "ú";
$quote[] = "Û";
$translate[] = "Û";
$quote[] = "û";
$translate[] = "û";
$quote[] = "Ù";
$translate[] = "Ù";
$quote[] = "ù";
$translate[] = "ù";
$quote[] = "Ü";
$translate[] = "Ü";
$quote[] = "ü";
$translate[] = "ü";
$quote[] = "Ç";
$translate[] = "Ç";
$quote[] = "ç";
$translate[] = "ç";
$quote[] = "Ñ";
$translate[] = "Ñ";
$quote[] = "ñ";
$translate[] = "ñ";
$quote[] = "<";
$translate[] = "";
$quote[] = "&";
$translate[] = "&";
$quote[] = """;
$translate[] = "\"";
$quote[] = "®";
$translate[] = "®";
$quote[] = "©";
$translate[] = "©";
$quote[] = "Ý";
$translate[] = "Ý";
$quote[] = "ý";
$translate[] = "ý";
$quote[] = "Þ";
$translate[] = "Þ";
$quote[] = "þ";
$translate[] = "þ";
$quote[] = "ß";
$translate[] = "ß";
$quote[] = " ";
$translate[] = " ";
/*
*/
$i = 0;
while(isset($quote[$i])){
$str = str_replace($quote[$i],$translate[$i],$str);
$i = $i + 1;
}
return $str;
}
assim… qndo tiver algum erro de caracteres a função resolve…
como tinha dito… No banco de dados as acentuações, cecedilhas e etc, estão perfeitos, porem qndo vai para a página ficar com o formato NULO… �
Porém com o que vc passou não foi possivel resolver, criei esta função q resolveu o problema que eu estava tendo…
converte a string “$str” para htmlentities e o “while” efetua a troca dos caracteres htmlentities para os normais…
espero ter ajudado alguém, pois mesmo com tudo que procurei na net, um dos mais próximos que encontrei para resolver foi o do R Beraldo…
Abraço!
Olá, Fábio Camargo.
Algo está com codificação errada. Eu uso UTF-8 em tudo e nunca preciso de htmlentities. Aliás, htmlentities gera mais problemas com UTF-8.
Verifique a codificação do arquivo (aquela modificada pelo editor de textos)
Então Beraldo, eu fiz estas verificações e estão perfeitas…
por isso não estou entendendo o que aconteceu…
PS.: apague meus dois últimos comentários [além deste], não ficaram como eu quis
Repassando…
a base e as tabelas no MySql esta com a codificação “utf8_general_ci”…
as páginas estão salvas em UTF-8 e os heads:
entendeu?
Fábio
Tive esse problema aqui com um sistema onde o banco atualizado tinha textos de planilhas do excel. Percebi que ao selecionar o formato texto nessa planilha, o próprio programa não reconhecia como texto. Os dados no Mysql ficaram perfeitos, já no html ficavam todos errados. Mesmo com a padronização do banco e das páginas para UTF-8. Sinistro isso. Sua função salvou minha vida. Abraço