Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

micox

[Resolvido] [Dica] Solução final para acentuação no Ajax

Recommended Posts

ATENÇÃO: Após estudar algumas coisas novas e ver alguns conselhos, ví que este tutorial está desatualizado e com algumas inverdades. Me discurpe hehe :(

 

Ae... pesquisei um pouco e desenvolvi a solução final pra esse problema de acento, acentuação, caracteres especiais, codificação, etc no Ajax.

 

Postei uma explicação um pouco mais completa dessa solução de acentuação no ajax lá no meu blog pra quem se interessar.

 

Atenção: Esta solução aqui é apenas no momento de receber os dados pelo javascript/ajax. Para capturar corretamente valores enviados por GET ou POST no PHP, dêem uma conferida nesta postagem do JulioGreff.

 

Já que o xmlhttprequest trabalha no padrão com o UTF-8, nós temos que informar ao nosso servidor que deve mandar o charset ISO-8859-1 pro browser, e não o UTF-8. O problema é que nunca havia conseguido fazer funcionar. Antes eu tentava fazer com a tag meta, nao dava certo.

 

Já ví vários esquemas viagens usando encode, escape, uri, utf_encode, etc...

 

Mas há uma forma simples de falar pro ajax receber o texto no formato nosso (iso-8859-1): é só alterar o servidor para que sirva o ISO-8859-1 por padrão OU setar o cabeçalho via linguagem dinamica.

 

Pra fazer isso você usa, no início do seu código:

 

ASP:

 

<% Response.Charset="ISO-8859-1" %>
PHP:

 

<?php header("Content-Type: text/html;  charset=ISO-8859-1",true) ?>
JSP:

 

<%@ page contentType="text/html; charset=ISO-8859-1" %>
Testado com sucesso no IE6 e FF1.5, quem puder testar em outros browsers, ou colocar seu testemunho aqui dizendo se funcionou ou não...

 

<editado>Lembrando que, se voce tiver acesso às configurações do servidor, voce poderá configurá-lo para servir ISO-8859-1 por padrão</editado>

 

 

PS.: Ah, e se alguém se interessar por uma função super simples e funcional pra ajax, dá uma testada na função simples pra ajax e múltiplos carregamentos que eu fiz... Testem lá e comentem.

 

PS2.: Se voce quer carregar um arquivo xml ou html simples que não usa linguagem server side, talvez voce consiga resolver o problema da acentuação usando só o a tag meta, mas se não conseguir você pode usar o responseXML ao invés do responseText pois, de acordo com a mozilla.org, o responseXML interpreta corretamente outros caracteres e não apenas o UTF-8.

 

PS3.: O problema também pode estar sendo causado por banco de dados. Se for isto, leia este post aqui mesmo nesta página: http://forum.imasters.com.br/index.php?s=&...st&p=572863

Share this post


Link to post
Share on other sites

só não entendi o , true ali pro php...

Fonte: br.php.net/header:

O parâmetro opcional replace indica quando um cabeçalho deverá substituir um cabeçalho similar anterior, ou adicionar um segundo cabeçalho do mesmo tipo. Por padrão irá substituir, mas se você passar FALSE como segundo argumento você poderá forçar multiplos cabeçalhos do mesmo tipo.

Share this post


Link to post
Share on other sites

Eu teste a solução para páginas JSP e não funcionou corretamente.Meu problema está sendo o seguinte.As mensagens internas do meu sistema ( como por exemplo avisos ao usuário, mensagens de erro, este tipo de coisa ) os caracteres com acento ou ç aparecem com ?. Ou seja... as frases que são escritas dentro do arquivo .js não funcionam.Todas as frases digitadas pelo usuário são tratadas corretamente e não geram erros, assim como os dados enviados pelo servidor em transições AJAX...Alguem sabe oq eu posso fazer para arrumar isso ?

Share this post


Link to post
Share on other sites

Ótimo, o primeiro depoimento de alguém que usa JSP.Bora tentar resolver seu problema:1) Abra sua página que foi chamada pelo ajax no browser diretamente (sem ser via ajax, digite o endereço dela no browser)2) veja qual foi a codificação resultante do browser (o Firefox é muito mlhor que o IE pra voce ver isso) indo em exibir>Codificação.3) Se voce tiver feito certo, a codificação será Ocidental (iso -8859-1) e os caracteres aparecerão corretamente.TEste ae e fale pragente dinovo que eu não entendi direito seu problema nao.

Share this post


Link to post
Share on other sites

A codificação apareceu certa, Ocidental (ISO-8859-1).

 

Bom vou tentar explicar melhor....

 

Por exemplo, eu possuo uma validação de um campo. Quando esta validação termina com sucesso nenhuma mensagem é gerada para o usuário, mas quando o dado não é valido uma mensagem é escrita ao usuário avisando-o que o dado é invalido... algo assim :

 

function validate( tf , msgFor ){	 valido = validacao( tf.value );	 if( valido == false )		  msgFor.innerHTML = "- Este dado é inválido."}

Ou seja... a função acima recebe um campo de texto ( tf ) e a sua respectiva mensagem de erro ( msgFor ). Em seguida é realizada a validação do valor presente em tf ( valido = validacao( tf.value ) ). Logo em seguida é verificado se o valor foi validado com sucesso ou não ( if.... ).

 

É nesta mensagem de erro que está surgindo meu problema. Ela está aparecendo desta forma.

 

- Este dado ? inv?lido.

 

Ou seja.... as frases que estão presente dentro do arquivo .js é que geram este problema.

Se o usuário digita algo com acento, o mesmo é tratado corretamente. Isto também ocorre com os dados vindos do servidor, também são tratados corretamente.

 

Espero que tenha dado para entender o meu problema. Estou pesquisando ele a muito tempo já e ainda não consegui achar nenhuma solução =/

 

Obrigado

 

Rodrigo Kerkhoff

Share this post


Link to post
Share on other sites

Ah sim rtk, acho que agora entendi.bom, então parece que sua dúvida não tem a ver com ajax.Voce pode fazer o seguinte então:1) não usar caracteres especiais no html e sim seus correspondentes.No seu caso ficaria: "Este dado é inv´lido."2) Colocar então essa codificação de caracteres no início do documento então. Da mesma forma que faria com seu arquivo ajax.

Share this post


Link to post
Share on other sites

Então realmente não tinha nada a ver com o ajax mesmo.

 

O problema era com o tomcat e o eclipse, mais vo esplica o que estava ocorrendo pq alguem pode precisa...

 

ECLIPSE

Bom... o eclipse mantém por default o encode US-ASCII para arquivos javascript, pois este é geralmente o configurado como padrão.Com isto toda vez que eu testava a aplicação o eclipse processava o arquivo e descartava os acentos, ç, etc...

Portanto foi necessário mudar isto para ISO-8859-1 indo ná propriedade do arquivo.

 

TOMCAT

Também foi necessário mudar o encode utilizado pelo tomcat, pois na hora efetuar o deploy para o server ele também processava o arquivo e trocava tudo por ?.

Foi necessário realizar o start do tomcat com o parâmetro -D file.encoding=ISO8859_1.

 

Obrigado

Rodrigo Kerkhoff

Share this post


Link to post
Share on other sites

Eh o seguinte ... ajax usa para enviar os Dados com UTF-8 caso seu banco de dados estiver em ISO-8859-1 vai dar problema com acentuação ... eh o mesmo caso para puxar os dados ...a saida que axei eh encodar a pagina em UTF-8 tanto para entrada quando para saida ...PHP fica :<?php header("Content-Type: charset=UTF-8) ?>e quando se vai gravar no banco ( se ele for charset diferente) da um utf_decode nos get/post ... na saida da um utf_encodeno JSP:<%@ page contentType="text/html; charset=UTF-8" %>e quando se vai gravar no banco ( se ele for charset diferente) da um (em scriptlet ... String nomeDocampo= new String(request.getParameter('nomeDocampoGET/POST').toString().getBytes("ISO-8859-1"),"UTF-8");para mandar não precisa encodar ...se for usar TagLibrary no jsp e tiver que encodar ... coloque a variavel em pareContext para por usar na TagLibrary ex:pageContext.setAttribute("nomeDocampo",nomeDocampo);

Share this post


Link to post
Share on other sites

Eh o seguinte ... ajax usa para enviar os Dados com UTF-8 caso seu banco de dados estiver em ISO-8859-1 vai dar problema com acentuação ... eh o mesmo caso para puxar os dados ...a saida que axei eh encodar a pagina em UTF-8 tanto para entrada quando para saida ...PHP fica :<?php header("Content-Type: charset=UTF-8) ?>

Pra exibir uma página puxada por ajax não precisa encodar não. Leia meu primeiro post que lá eu explico.Agora já, pra enviar, precisa encodar sim (encodeURI ou equivalente)...

Share this post


Link to post
Share on other sites

Cara, não sei se você vai poder me ajudar, acontece que eu estou com esse problema de acentuação usando Ajax no método POST, mais o problema eh que eu tow armazenando no Banco de Dados essas informações vindas do formulário, direto, e tah indo tudo errado, mesmo com o cabeçalho que você sugeriu......Alguma sugestão......Vallew....Teh mais......

Share this post


Link to post
Share on other sites

E ae jtsjunior,

 

Seguinte: essa solução minha aí é pra RECUPERAR os caracteres acentuados.

Seu problema está em ENVIAR os caracteres, pois os browser SÓ ENVIAM EM UTF-8 (pelo que eu sei). Como em UTF-8 não há caracteres especiais, o browser converte, perde, etc... seus caracteres.

 

A forma de resolver na hora do ENVIO voce encontra aqui.

Share this post


Link to post
Share on other sites

e quando se vai gravar no banco .... ta ali em cima ...no JSP:<%@ page contentType="text/html; charset=UTF-8" %>e quando se vai gravar no banco ( se ele for charset diferente) da um (em scriptlet ...String nomeDocampo= new String(request.getParameter('nomeDocampoGET/POST').toString().getBytes("ISO-8859-1"),"UTF-8");PHP:pegar dados com utf_decode ...era soh ler um pouco....

Share this post


Link to post
Share on other sites

Pessoal andei pesquisando um pouco na net e encontrei esse artigo que ensina como como resolver esse problema.

 

http://forum.imasters.com.br/public/style_emoticons/default/excl.gif o link é http://www.tableless.com.br/forum/viewtopic.php?t=2966

 

 

 

Espero ter colaborado.

Share this post


Link to post
Share on other sites

Valeu aí pela contribuição fyoda, editarei o post original.

Share this post


Link to post
Share on other sites

Micox,

 

Caso possa ajudar, agradeço porque já estou sem saber mais o que fazer.

Seguinte, na máquina de desenvolvimento (minha) os sites funcionam 100% (tanto Firefox quanto IEca, seja local ou acessando a página do server). No cliente, não.

Fui eliminando, caçando na net alguma coisa que me ajudasse. Fiz de tudo: passo o charset no header (via PHP), setei o charset das páginas para ISO-8859-1 na tag <meta>, dei 3 pulos na frente do monitor, benzi o teclado, nada resolveu. Continua a bagaça saindo "?" no lugar dos caracteres acentuados.

Enfim, pelo que pude apurar, o erro ocorre com o conteúdo dinâmico, quem vem do banco via PHP e é exibido via Ajax. A conclusão que chego: Ajax é a causa de meus problemas. Mas como solucionar???

Em outro forum sugeriram tratar isto antes do Ajax exibir o requestText. Tentei mas sem solução.

 

Bom, caso possa passar alguma idéia que me ajude, agradeço.

 

JJr

 

 

Share this post


Link to post
Share on other sites

FAz o seguinte teste js,Abre sua página sem ser via ajax e veja se os caracteres aparecem escrotos.- Se eles não aparecerem, você vai em exibir>codificação e veja em qual codificação o Firefox jogou sua página.- Se eles aparecerem zoneados, então é culpa do PHP/Banco de dados mesmo.Faz o teste aí e me fala o que que deu.

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.