LuX_ 2 Denunciar post Postado Fevereiro 11, 2012 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
hinom 5 Denunciar post Postado Fevereiro 11, 2012 http://forum.imasters.com.br/topic/340459-php-html-mysql-charset-encoding/ Compartilhar este post Link para o post Compartilhar em outros sites
lusigmas 0 Denunciar post Postado Fevereiro 11, 2012 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
Henrique Barcelos 290 Denunciar post Postado Fevereiro 11, 2012 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
LuX_ 2 Denunciar post Postado Fevereiro 12, 2012 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! Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Fevereiro 13, 2012 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