解决:JS向后台传参,IE下中文未编码问题

1.问题描述

   项目中用jQuery向后台URL传参获取数据时,google浏览器正常执行,但IE没有数据返回。js代码如下:

  

jsonurl = urlPreffix +"getInfoByCity.do?city="+$j("#city").val();
$j.getJSON(jsonurl,function(data) {
.....
})

2.分析

   用浏览器调试后显示:

   Google下URL为:....getInfoByCity.do?city=%e5%8c%97%e4%ba%ac(其中http头信息中涉及编码的地方均为utf-8)

   IE下URL为:....getInfoByCity.do?city=北京(其中http头信息中涉及编码的地方均为utf-8)

   为防止URL特殊字符截断影响解析,传参时要做URL编码,编码成%xx的形式。开始猜测是因为IE没有对中文做编码,但是URL中的特殊字符(非ASCII码)是必须经过编码才能访问的。

   到此基本可以认为问题是参数中中文编码出错导致。编码原理是先获取字符在某种字符集(utf-8、gb2312等)下对应的十六进制编码,再两两一组前加上%形成。如北京在UTF-8下的十六进制编码为e58c97e4baac,因此它的URL编码为%e5%8c%97%e4%ba%ac(这也正是谷歌浏览器的结果)。gb2312下却是%b1%b1%be%a9。

   那么问题就清楚了,因为Google中为utf-8编码且能正常查询出数据,推断服务器用utf-8解码。那么,肯定是因为IE下按照非utf-8(一般是GB2312)对汉字做了编码,但是服务器解码的时候是按照utf-8解码的,自然就会乱码,也就查不出数据了。

3.解决

   既然浏览器对URL编码存在那么多的差异及不确定性,那么最好的解决办法就是在把URL传给浏览器之前就将编码工作做完,这些问题就不存在了。下面两个方案都是先编码再传给浏览器的方法。

   方案一:对URI编码再拼接到URL上(后台获取到参数后不必自己做解码,系统会自动解码)

jsonurl = urlPreffix +encodeURI("getInfoByCity.do?city="+$j("#city").val());
$j.getJSON(jsonurl,function(data) {
......
})

   除了encodeURI函数外,jQuery还提供了一个编码函数encodeURIComponent,但是这个函数对字符&?也会做编码,所以这个函数不能传入参与URL解析的字符,最好只传入参数值,如:

jsonurl = urlPreffix +"getInfoByCity.do?city="+encodeURIComponent($j("#city").val());

 

  方案二:直接用getJSON函数的第二个参数传入JSON形式的参数对,函数内自动编码:

var params = {"city":$j("#city").val()};
jsonurl = urlPreffix +"getSellerInfoByCity.do";
$j.get(jsonurl,params,function(data) {
......
})

4.总结

  虽然问题已经解决,但对原理还是一知半解,需要进一步学习。

   


  



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值