Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

LuX_

[Resolvido] Problema com, encoding utf8

Recommended Posts

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

 

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.