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.

25 comentários sobre “AJAX e Acentos

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

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

  4. Olá Rafael,

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

    Um grande abraço,

    Rodrigo

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

  6. Muito obrigado cara! 😀

    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!

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

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

    Abração!

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

    😉

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

    mas funcionou perfeitamente
    muito obrigado mesmo…

    abraços

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

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

Os comentários estão desativados.