July 31st 2006 08:46 pm

AJAX e Acentos

Surfando pelos blogs procurando um novo tópico para postar acabei caindo no blog do Gustavo Paes em um artigo que falava sobre problemas de acentos no AJAX. Vou aproveitar então e refletir sobre este assunto também.

AJAX nasceu para o UTF-8 disso não tenho dúvidas, mas o XML tem seu lado ISO-8859-1, embora eu já tenha enfrentado inúmeros problemas sobre este aspecto de codificação. Bem temos dois lados do problema com AJAX, acentos e transmissão de dados.

Recebendo dados em XML

Quando os dados são recebidos por uma transmissão AJAX a forma mais comum utilizada é o XML. Porém o XML por padrão utiliza a codificação UTF-8 e quando os dados são lidos pelo javascript a coisa fica confusa e acentos viram hieróglifos. Com o tempo achei uma solução que me atendeu e achei outras que muitos sugerem mas por algum motivo não funcionou comigo, como esta.

Minha solução entao foi a seguinte:

No arquivo que gera os dados, utilizo este cógido

PHP:
  1. $string = rawurlencode($dados);

Isso resolve a transmissão e confusão UTF-8 e ISO, e também me permite retornar códigos HTML completos para o arquivo que recebe.

No arquivo que recebe, dentro da função que interpreta os dados recebidos uso esta função para reverter:

JavaScript:
  1. var string = unescape(dados);

Enviando dados por AJAX

Quando você envia dados via AJAX para um script que grava no banco de dados, você muito provavelmente terá problemas com acentos nos dados que guardará no banco. A sintonia perfeita de "collate" e Charset do banco, com o cliente, e o PHP é algo complicado e trabalhoso de se obter usando cabecalhos (headers), por isso achei outra solução, que não é a mais comoda, mas é simples e resolve sempre.

Faço o envio de dados de forma padrão sem mecher em nenhuma configuração de charset do javascript ou ajax, deixo todo o tratamento para o php, onde executo a seguinte função no array $_POST, de onde provem os dados que vou gravar.

PHP:
  1. <?
  2. function ajaxPostFix (&$value){
  3.     $value = utf8_decode($value);
  4. }
  5.  
  6. array_walk($_POST,'ajaxPostFix');
  7. ?>

Pronto. resolvido o problema, dados gravados corretamente.

Ok, estes são meu "2 centavos" sobre o assunto.

1 Star2 Stars3 Stars4 Stars5 Stars (12 votos, média: 4.42 de 5)
Loading ... Loading ...

20 Comments »

20 Responses to “AJAX e Acentos”

  1. Gevã on 03 Sep 2006 at 17:11 #

    Muito obrigado, Rafael! Estava procurando a tarde inteira na web para resolver o problema de acentos quando você envia os dados por ajax. Foi só colocar a utf8_decode e a busca funcionou direitinho. Os seus “dois centavos” são de ouro.

  2. Rafael Dohms on 03 Sep 2006 at 22:40 #

    Obrigado pelo elogio, que bom que pude ajudar, entendo como é porque passei por tudo isso tb.

    Abraços!

  3. Adilson on 12 Sep 2006 at 12:51 #

    Olá Rafael,

    uso o Ajax como galeria de fotos e não vejo melhor.
    Seu tutorial acima nao posso contestar, mas nao conseguir resolver como vc descreve, e fiz o serguinte, troquei o iso-8859-1, por : utf-8.

    Um forte abraço!

  4. Rafael Palmezan on 22 Sep 2006 at 15:59 #

    Otimo, Resolveu :D
    Muito Obrigado

  5. Rafael Dohms on 26 Sep 2006 at 1:24 #

    Rafael,

    Obrigado você pela visita, que com que pude ajudar.

    Abraços

  6. Silvio Delgado on 08 Mar 2007 at 23:21 #

    Olá, Rafael.
    O link que você enviou apresenta uma solução que foi satisfatória para mim:
    basta acrescentar
    header(”Content-Type: text/html; charset=ISO-8859-1″,true);
    no arquivo que contém o conteúdo a ser retornado pelo ajax.

    Espero que ajude também.
    Abraços.

  7. Rafael Dohms on 09 Mar 2007 at 0:32 #

    Silvio,

    Na teoria isso deve funcionar, mas eu tive alguns obstaculos, resumindo, tudo depende da situação.

    Abraço

  8. Rodrigo on 24 Mar 2007 at 0:33 #

    Olá Rafael,

    Perfeita a solução “Enviando dados por AJAX”… Funcionou 100%!

    Um grande abraço,

    Rodrigo

  9. Rafael on 03 Apr 2007 at 14:25 #

    Boa tarde chará,

    obrigado pela solução, o utf8_decode funcionou perfeitamente!

  10. Euler on 18 May 2007 at 9:09 #

    Não sei porque, mas a sua dica foi a única solução para resolver meu problema, depois de ter peregrinado por vários sites. Obrigado pela dica, e sucesso pra você.

  11. Rui Ponte on 07 Jun 2007 at 17:41 #

    Muito obrigado cara! :D
    Resolveu meu problema, a única coisa batendo mal é, por exemplo, o sinal do € (euro) que sai sempre ? (ponto de interrogação).

    Alguma solução?
    Obrigadão!

  12. Maurício Fragoso on 19 Jun 2007 at 15:40 #

    /*
    function ajaxPostFix (&$value){
    $value = utf8_decode($value);
    }
    array_walk($_POST,’ajaxPostFix’);
    */

    Isso resolveu meu problema!! =D
    Vivendo e aprendendo!
    Valeu!!

    Abração!

  13. Erick Leão on 20 Jun 2007 at 16:48 #

    Show de bola aqui tbm resolveu muito bom…

    Kra uma coisa qual puglin vc está usando para colocar codigos de php na tela ae? tem como vc me passar? pois eu tenho o meu blog dando dicas só que zoa =/ valeu

    qualquer coisa meu msn

    erick_leao [at] hotmail dot com

    ;)

  14. Sérgio Cruz on 21 Jun 2007 at 15:18 #

    Estava tendo sérios problemas com isso !

    Funcionou perfeitamente, abriu minha mente !

    Muiiiito obrigado ;D

  15. Eric Gabriel on 17 Aug 2007 at 16:48 #

    cara
    eu nao entendi uma linha da logica do:

    mas funcionou perfeitamente
    muito obrigado mesmo…

    abraços

  16. Leandro on 24 Sep 2007 at 17:16 #

    Vlw cara, resolveu metade dos meus problemas.
    funcionou perfeito,
    valeu mesmo.

    Abraços

  17. Eliano Estevam on 30 Sep 2007 at 11:06 #

    Muito bom…

    Resolveu o meu problema !

  18. Ricardo on 15 Oct 2007 at 19:17 #

    Rafael… fantástico. muito boa sua dica… a muito tempo estou procurando a solução!!!! Fantástico.. muito obrigado.

  19. Wilian Fiabani on 11 Feb 2008 at 10:35 #

    simplesmente, o melhor…

  20. Marcos on 02 Mar 2008 at 20:27 #

    Maluco vc é um Gênio !!!! Bejo na Testa hahaha !!!!

Trackback URI | Comments RSS

Leave a Reply

« Blogosfera em destaque | strtotime() - Pode ajudar? »