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.


September 3rd, 2006 - 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.
September 3rd, 2006 - 22:40
Obrigado pelo elogio, que bom que pude ajudar, entendo como é porque passei por tudo isso tb.
Abraços!
September 12th, 2006 - 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!
September 22nd, 2006 - 15:59
Otimo, Resolveu
Muito Obrigado
September 25th, 2006 - 23:24
Rafael,
Obrigado você pela visita, que com que pude ajudar.
Abraços
March 8th, 2007 - 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.
March 9th, 2007 - 00:32
Silvio,
Na teoria isso deve funcionar, mas eu tive alguns obstaculos, resumindo, tudo depende da situação.
Abraço
March 24th, 2007 - 00:33
Olá Rafael,
Perfeita a solução “Enviando dados por AJAX”… Funcionou 100%!
Um grande abraço,
Rodrigo
April 3rd, 2007 - 12:25
Boa tarde chará,
obrigado pela solução, o utf8_decode funcionou perfeitamente!
May 18th, 2007 - 09: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ê.
June 7th, 2007 - 17:41
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!
June 19th, 2007 - 15:40
/*
function ajaxPostFix (&$value){
$value = utf8_decode($value);
}
array_walk($_POST,’ajaxPostFix’);
*/
Isso resolveu meu problema!! =D
Vivendo e aprendendo!
Valeu!!
Abração!
June 20th, 2007 - 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
June 21st, 2007 - 15:18
Estava tendo sérios problemas com isso !
Funcionou perfeitamente, abriu minha mente !
Muiiiito obrigado ;D
August 17th, 2007 - 16:48
cara
eu nao entendi uma linha da logica do:
mas funcionou perfeitamente
muito obrigado mesmo…
abraços
September 24th, 2007 - 15:16
Vlw cara, resolveu metade dos meus problemas.
funcionou perfeito,
valeu mesmo.
Abraços
September 30th, 2007 - 09:06
Muito bom…
Resolveu o meu problema !
October 15th, 2007 - 19:17
Rafael… fantástico. muito boa sua dica… a muito tempo estou procurando a solução!!!! Fantástico.. muito obrigado.
February 11th, 2008 - 10:35
simplesmente, o melhor…
March 2nd, 2008 - 20:27
Maluco vc é um Gênio !!!! Bejo na Testa hahaha !!!!
September 18th, 2008 - 17:10
Valeu Rafael, algo simples que me fugiu da cabeça na hora que mais precisei…rsrsrs
December 28th, 2008 - 12:48
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
February 28th, 2009 - 16:00
Valew….
Acabou com dois dias de sofrimento !
Já estava quase desistindo.
Abraço !
May 17th, 2010 - 13:39
November 11th, 2010 - 14:14
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.
November 28th, 2011 - 01:44
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!!