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.
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.
Obrigado pelo elogio, que bom que pude ajudar, entendo como é porque passei por tudo isso tb.
Abraços!
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!
Otimo, Resolveu 😀
Muito Obrigado
Rafael,
Obrigado você pela visita, que com que pude ajudar.
Abraços
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.
Silvio,
Na teoria isso deve funcionar, mas eu tive alguns obstaculos, resumindo, tudo depende da situação.
Abraço
Olá Rafael,
Perfeita a solução “Enviando dados por AJAX”… Funcionou 100%!
Um grande abraço,
Rodrigo
Boa tarde chará,
obrigado pela solução, o utf8_decode funcionou perfeitamente!
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ê.
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!
/*
function ajaxPostFix (&$value){
$value = utf8_decode($value);
}
array_walk($_POST,’ajaxPostFix’);
*/
Isso resolveu meu problema!! =D
Vivendo e aprendendo!
Valeu!!
Abração!
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
😉
Estava tendo sérios problemas com isso !
Funcionou perfeitamente, abriu minha mente !
Muiiiito obrigado ;D
cara
eu nao entendi uma linha da logica do:
mas funcionou perfeitamente
muito obrigado mesmo…
abraços
Vlw cara, resolveu metade dos meus problemas.
funcionou perfeito,
valeu mesmo.
Abraços
Muito bom…
Resolveu o meu problema !
Rafael… fantástico. muito boa sua dica… a muito tempo estou procurando a solução!!!! Fantástico.. muito obrigado.
simplesmente, o melhor…
Maluco vc é um Gênio !!!! Bejo na Testa hahaha !!!!
Valeu Rafael, algo simples que me fugiu da cabeça na hora que mais precisei…rsrsrs
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
Valew….
Acabou com dois dias de sofrimento !
Já estava quase desistindo.
Abraço !
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.