Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá Pessoal,
Sei que já devem haver muitos posts desse tipo, mas este eu estou colocando porque tudo o que procurei na web não resolveu!
Seguinte, estou usando PHP 5.3.8 num computador de S.O FreeBSD-8.2-RELEASE, Banco de dados Mysql 5.1
Meu problema com encodings é o seguinte:
Sempre que eu escrevo uma palavra que vem do banco de dados, via echo() os caracteres especiais saem errados.
Significa que, ele funciona quando eu faço
echo('água');
Mas não funciona se eu faço:
$texto = $array_vindo_mysql_fetch['campo'];
echo($texto);
Primeiramente pensei que o problema foi do Mysql, então para todas as tabelas eu especifiquei DEFAULT CHARSET e o Collation como UTF-8.
No arquivo PHP eu iniciei com:
header("Content-type: text/html;charset=utf-8");
No HTML eu já inseri a devida tag meta com o charset utf-8.
Salvei todos os meus arquivos em UTF-8 sem BOM.
E minha última esperança era o:
mysql_set_charset("utf-8")
Mas também não resolveu.
Ainda assim eu defini no php.ini o default charset como utf-8 e confirmei isto no phpinfo().
Outro detalhe importante é: as strings realmente parecem estar vindo em UTF-8, vejam só:
$texto = utf8_decode($array_vindo_mysql_fetch['campo']);
echo($texto);
Funciona, o que significa que o navegador só está aceitando os textos convertidos para Latin1. Mas por que??
Não quero ter que ficar a todo instante convertendo caracteres, isso não é solução, é contornar o problema.
Estou desesperado, não sei mais o que fazer para resolver isto! Alguém já passou por isto?
Olá Lux,
recentemente tive esse problema e também fiquei no desespero, pois nada funcionava.
Acabei resolvendo ao unir duas soluções sugeridas nos tópicos.
Funcionou assim:
<?php
//no início:
mb_internal_encoding("UTF-8");
mb_http_output( "iso-8859-1" );
ob_start("mb_output_handler");
header("Content-Type: text/html; charset=ISO-8859-1",true);
//na busca:
$texto = utf8_encode($array_vindo_mysql_fetch['campo']);
echo($texto);
?>
Teste e depois me conte ok?
Abs.
Verificou a codificação do navegador?
Por padrão ela vem iso-8859-1 (latin1).
Eu não recomendo utilizar utf8 pois o PHP, até a versão 5 (atual), não tem suporte nativo ao unicode.
No PHP, caracteres são representados em 1 byte, o que significa que existem apenas 256 caracteres representáveis.
Entretanto, textos em unicode surgiram com o intuito de termos uma representação única para todas as linguagens, incluindo aquelas que, como o português, possuem caracteres especiais, como acentos, letras diferentes do alfabeto inglês (alemão, russo, árabe, etc). Para conseguir isso, alguns caracteres são representados com 2 bytes, o que nos permite representar 65536 caracteres diferentes, o que é mais que suficiente para representar os alfabetos mais utilizados no mundo (contanto que se utilize os alfabetos orientais de países como China, Japão e Coreia simplificados).
Veja a tabela Latin1:
:seta: http://en.wikipedia.org/wiki/ISO/IEC_8859-1
A codificação utf-8 é uma "simplificação" do unicode, que também tem a representação de tamanho variável 1 ou 2 bytes:
:seta: http://en.wikipedia.org/wiki/UTF-8
Eu sempre tive problemas com utf8, ao passo que com iso-8859-1/latin1 as coisas fluem normalmente.
O único problema é se você resolver utilizar Ajax, que só suporta UTF8. Nesse caso, você precisa tratar as entradas com utf8_decode() e forçar a codificação de saída com o header:
Content-Type: text/html; charset=ISO-8859-1
>
Verificou a codificação do navegador?
Por padrão ela vem iso-8859-1 (latin1).
Eu não recomendo utilizar utf8 pois o PHP, até a versão 5 (atual), não tem suporte nativo ao unicode.
No PHP, caracteres são representados em 1 byte, o que significa que existem apenas 256 caracteres representáveis.
Entretanto, textos em unicode surgiram com o intuito de termos uma representação única para todas as linguagens, incluindo aquelas que, como o português, possuem caracteres especiais, como acentos, letras diferentes do alfabeto inglês (alemão, russo, árabe, etc). Para conseguir isso, alguns caracteres são representados com 2 bytes, o que nos permite representar 65536 caracteres diferentes, o que é mais que suficiente para representar os alfabetos mais utilizados no mundo (contanto que se utilize os alfabetos orientais de países como China, Japão e Coreia simplificados).
Veja a tabela Latin1:
:seta: http://en.wikipedia.org/wiki/ISO/IEC_8859-1
A codificação utf-8 é uma "simplificação" do unicode, que também tem a representação de tamanho variável 1 ou 2 bytes:
:seta: http://en.wikipedia.org/wiki/UTF-8
Eu sempre tive problemas com utf8, ao passo que com iso-8859-1/latin1 as coisas fluem normalmente.
O único problema é se você resolver utilizar Ajax, que só suporta UTF8. Nesse caso, você precisa tratar as entradas com utf8_decode() e forçar a codificação de saída com o header:
Content-Type: text/html; charset=ISO-8859-1
Fala Henrique, muito obrigado por ter postado. Na verdade a codificação do navegador sempre respeita a tag meta que se insere no início do HTML e o Header PHP. Na descrição do meu Post eu mostrei que tentei ambos e ainda assim não funcionou. Quanto as outras dicas eu vou fazer os testes agora.
>
Olá Lux,
recentemente tive esse problema e também fiquei no desespero, pois nada funcionava.
Acabei resolvendo ao unir duas soluções sugeridas nos tópicos.
Funcionou assim:
<?php
//no início:
mb_internal_encoding("UTF-8");
mb_http_output( "iso-8859-1" );
ob_start("mb_output_handler");
header("Content-Type: text/html; charset=ISO-8859-1",true);
//na busca:
$texto = utf8_encode($array_vindo_mysql_fetch['campo']);
echo($texto);
?>
Teste e depois me conte ok?
Abs.
Fala Lusigmas, muito obrigado pela resposta. Ainda não testei a sua dica, mas deixa eu tentar entender:
Na primeira linha:
mb_internal_encoding("UTF-8");
A gente tá forçando o PHP a trabalhar com UTF-8.
Na segunda linha:
mb_http_output( "iso-8859-1" );
A gente tá forçando o PHP a tansformar todo o texto da saída em ISO-8859-1 e isto seria equivalente a fazer utf8_decode() em todos os textos não é?
Esta é uma solução a se pensar, mas mesmo assim acho que a gente não ataca bem a raíz do problema não acha? Pq a gente vai simplesmente dar um jeito de o texto sair em ISO-8859-1 e não vamos fazer o PHP funcionar com UTF-8, me entende?
Claro que não estou descartando, mas eu preferia deixar esse tipo de coisa só em última instância, sabe? Porque eu acredito que não haja barreiras pra usar UTF-8, ou pelo menos não deveria, não é?
Valeu cara, mas mesmi assim vou testar o que você postou!
Pessoal, acabei de encontrar a resposta para este problema. Para conferir os dados eu sempre usei a interface do terminal para acessar o mysql.
NO entanto, embora a minha conexão do PHP com o MySQL estivesse realmente em UTF-8, a minha conexão com o MySQL pelo terminal estava configurada por padrão a ocorrer com latin1.
O que aconteceu foi: Eu inseri os dados via terminal, pelo comando insert e não percebi que os dados estavam entrando lá como latin1, eu achei que este problema não ocorresse, já que configurei a tabela como utf-8 no default charset e no collation.
Então eu via os acentos perfeitos no terminal e, achando que estavam em UTF-8 pensei que o problema era o PHP.
Quando me conectei no MySQL desta forma:
mysql -u nomedousuario -p --default-character-set=utf8
Percebi que os dados estavam com os caracteres especiais estragados. Quando eu inseri os dados de novo (porque agora estava conectado em UTF-8) eles ficaram certos na interface e na página!
Problema resolvido.
>
http://forum.imasters.com.br/topic/340459-php-html-mysql-charset-encoding/
Hinom, seu link com aquele tutorial foi muito importante. Se eu puder dar uma dica, seria legal se você postasse como sugestão, conectar-se pelo MySQL (Na interface) com default-charset=utf8. (Está melhor explicado no meu último post), assim a gente pode ajudar a diminuir as ocorrências desse problema não é?
Muito obrigado pela ajuda!
LuX, mostrou-se bem esforçado em resolver o problema. É assim que deve ser. Parabéns.
Quanto a sugestões pode postar lá no tópico. É aberto para todos postarem.
Desculpe por não ter tempo de atualizar o tópico. Está um pouco antigo mas ainda serve de ajuda básica.. quando tiver tempo farei um novo ou quem quiser, pode tomar iniciativa e criar um novo quando aquele estiver muito defasado.
http://forum.imasters.com.br/topic/340459-php-html-mysql-charset-encoding/