Rafael Dohms Web Engineer

31Jul/0626

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

$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:

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.

< ?
function ajaxPostFix (&$value){
	$value = utf8_decode($value);
}

array_walk($_POST,'ajaxPostFix');
?>

Pronto. resolvido o problema, dados gravados corretamente.

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

Comentários (26) Trackbacks (0)
  1. 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. Obrigado pelo elogio, que bom que pude ajudar, entendo como é porque passei por tudo isso tb.

    Abraços!

  3. 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,

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

    Abraços

  5. 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.

  6. Silvio,

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

    Abraço

  7. Olá Rafael,

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

    Um grande abraço,

    Rodrigo

  8. Boa tarde chará,

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

  9. 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ê.

  10. 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!

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

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

    Abração!

  12. 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

    ;)

  13. Estava tendo sérios problemas com isso !

    Funcionou perfeitamente, abriu minha mente !

    Muiiiito obrigado ;D

  14. cara
    eu nao entendi uma linha da logica do:

    mas funcionou perfeitamente
    muito obrigado mesmo…

    abraços

  15. Vlw cara, resolveu metade dos meus problemas.

    funcionou perfeito,

    valeu mesmo.

    Abraços

  16. Muito bom…

    Resolveu o meu problema !

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

  18. simplesmente, o melhor…

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

  20. Valeu Rafael, algo simples que me fugiu da cabeça na hora que mais precisei…rsrsrs

  21. Rafael,

    eu uso o Delphi for php, e tenho este problema de acentuação no ajax com
    o componente Dbgrid. vc conhece alguma solução?

    valeu

  22. Valew….

    Acabou com dois dias de sofrimento !

    Já estava quase desistindo.

    Abraço !

  23. A solução se constitui em 2 providências:
    1 – Chamada:
    $.ajax({
    url : “Ajax_getxxx.asp?Matr=”+Matr,
    success : function (data) {
    window.status = data;
    $(“TEXTAREA[Id=IdTextarea]“).html(data);

    }
    });
    2 – Stub ASP (fornecedor da informação):
    Session.CodePage = 1252
    strSQL = …
    Set conn = Server.CreateObject(A…)
    conn.Open CONN_STRING
    Set rsTask = Server.CreateObject(…)
    rsTask.Open strSQL,conn,3,3

    Response.CharSet = “iso-8859-1″
    Response.AddHeader “Content-Type”, “text/html; charset=iso-8859-1″

    Complementando,

    Existe uma diferença entre as tabelas de codificação de caracteres para as diversas circunstâncias que são estabelecidas na execução de um código ASP:

    A codificação do HTML de apresentação é resolvida com a tag META. A codificação de trabalho do ASP, ao receber o conteúdo de um campo memo (ou BLOB) é a ISO-LATIN (1252).

    Daí a diferença. Todas as dicas anteriores funcionam com campos text (VARCHAR) e não com BLOB.

  24. Cara, valeu demais!!! Estava pesquisando aqui uma maneira de terminar um auto-complete (semelhante ao Google Suggest, mas com AJAX, diferentemente do que o google faz com script) e os acentos vinham sempre bagunçados. Estava pensando em fazer autocomplete com o CID 10 jogado no MySQL e funcionou perfeitamente com o "utf8_decode"!!!
    Muito obrigado pela dica!!


Leave a comment

(required)

Sem trackbacks