Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá. Fazia tempos que eu não aparecia, estava estudando...
Fiz um sistema em php / mySQL e agora estou construindo uma interface AJAX para o sistema. Em php é mais tranquila a questão dos caracteres especiais, trabalho só em UTF-8 e os acentos não dão problema, apenas alguns caracteres como "&". Em AJAX, tenho que passar os dados para o php e já é uma outra fonte de problemas. Pensei em codificar em hexadecimal, tipo uma linha query string, segundo o que eu li nesse ótimo artigo:
http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
Os textos ficariam bastante alterados. A questão é: decodificar ao receber no php antes de enviar para o mySQL ou mandar assim mesmo?
Se eu não decodificar, será mais seguro, penso eu; Mas se eu decodificar, fica mais "limpinho" dentro da base, posso editar direto, e usar os resultados de uma query sem ter que decodificar toda a vez.
Como estou desenvolvendo sozinho, gostaria de saber a opinião de outros desenvolvedores. O que vocês adotam como solução?
Vou dar um exemplo a partir do caracterzinho que eu citei. O formulário é o seguinte:
nome: Fulano & Cicrano Cia. LTDA
email: fulano@nonono.com.br
Em ActionScript, por exemplo, eu crio um objeto tipo:
objeto.nome = 'Fulano & Cicrano Cia. LTDA';
email: 'fulano@nonono.com.br';
Mando por POST e fim de papo. Mas em AJAX o método send do objeto xmlhttprequest enviará uma string:
nome=Fulano & Cicrano Cia. LTDA&email=fulano@nonono.com.br
Ooops, o "&" PODE da problema!
Também tive problemas ao trabalhar com XML onde aparecem <>/ e até outros símbolos, principalmente com IE.
o & você deve codificar para
&
e o < você deve codificar para
<
e pronto.
Ok, então você de fato codifica antes de enviar para o php. Nesse caso, talvez o melhor fosse em hexa para tirar o & de campo já que ele está separando as variáveis (& => %26).
Em todo o caso, ao receber o dado no php, você decodifica para lança-lo na base, ou grava o registro com o dado codificado?
Eu gosto de trabalhar com dados puros.
Apenas o & que mantenho na forma
&
por causa de problemas com o XML.
Tudo depende da exibição que você precisa. Não tem sentido codificar acentos por exemplo..
Bom, pessoalmente eu tenho duas páginas rodando ajax que mandam dados para uma base e raramente dão problemas (dá erro porque um símbolo se confunde com os códigos). Talvez com correçoes simples em alguns códigos funcione. Mas meu objetivo é algo mais robusto, à prova de erros - se é que é possível. Pelo menos entre o ajax e o php, os dados passarão por uma conversão segundo a função abaixo, considerando caracteres de controle, reservados e "inseguros":
// Condifica em hexadecimal 8 bits
var encodeHEX = function(str){
// Tirando os % que serão usados para decodificar e os caracteres de controle
for(var i=0; i<str.length; i++){
if(str.charCodeAt(i)<32 || str.charAt(i)=="%") {
var hex = str.charCodeAt(i).toString(16);
if(hex.length == 1) hex = "0"+hex;
str = str.substr(0,i)+'%'+hex+str.substr(i+1);
}
}var strTab = new Array(32,34,35,36,38,43,44,47,58,59,60,62,63,64,91,92,93,94,96,123,124,125,126,127);
for(var i=0; i<strTab.length; i++){
while(str.indexOf(String.fromCharCode(strTab[i]))>=0){
var ichr = str.indexOf(String.fromCharCode(strTab[i]));
var hex = str.charCodeAt(ichr).toString(16);
if(hex.length == 1) hex = "0"+hex;
str = str.substr(0,ichr)+'%'+hex+str.substr(ichr+1);
}
}
return str;
}
var decodeHEX = function(str){
var iicod = 0; var icod = str.indexOf("%", iicod);
var hex = str.substr(icod+1,2);
str = str.substr(0,icod)+String.fromCharCode(parseInt(hex,16))+str.substr(icod+3);
var iicod = icod + 1;
}
return str;
}
O código foi testado e funcionou, mas talvez dê para otimizá-lo um pouco...
Já do php para mySQL, sou como o William, prefiro trabalhar com os dados puros. Os acentos não tem me dado mais nenhum problema depois que padronizei meu desenvolvimento em UTF-8.
pq você está tendo problemas ?
e quais problemas você está tendo ?
se trabalhar em UTF8, ajax envia por default em UTF8, e jSON é UTF8.. então você não deveria ter nenhum problema..