jQuery load方法及Ajax传递中文参数值乱码问题解决

 

function query()
    {
    $("#s").html("<tr><td>正在加载中...</td></tr>");
    var type=$('#select_type').val();
    var forward=$('#select_forward').val();
    var customer=$('#customer').val();
    var cpmc=$('#cpmc').val();
    $("#s").load("<%=request.getContextPath()%>/historyQueryAction.do",
     {"method":"query","type":type,"forward":forward,“customer":customer,"cpmc":cpmc});
    }      

我想用jsp实现这样一个效果:上面是查询区域,select_type是个下拉框,用来选择运输方式,select_forward也是下拉框,用来选择车辆去向customer是客户,cpmc是产品名称,点击查询后,在下面显示出查询结果,但是不刷新页面,这个效果很简单,不过实现时会遇到一个比较棘手的问题:中文参数的传递。下面总结几种方法,来解决这个麻烦:

首先,将所有页面的编码都转成utf-8,一般的问题都能解决,

》》在html文件头部加入如下代码:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

》》在服务器端加上:request.setCharacterEncoding("UTF-8");

》》如果还是不行,那就用Editplus打开文件,另存为utf-8编码的文件。之所以这么做,是因为jQuery使用的编码是utf-8,但是操作系统默认的编码是gbk。这个问题在ie上比较突出。用火狐浏览器测试就没事。

》》$.ajax()传的值做下处理

encodeURIComponent("中文字符")

当然,如果全站能改成utf-8最好了,如果是旧的系统,上面的方法可以一试。

》》还有可以改成

$.ajax({
url:"<%=request.getContextPath()%>/historyQueryAction.do" ,
type:"POST" ,
dataType:"json" ,
data:"{"method":"query","type":type,"forward":forward,“customer":escape(customer),"cpmc":escape(cpmc)}",
success:function(results){
alert(results.message);
}
});这种方法也是只加一个escape就好了。

》》如果不想换,非要用load方法,那也行啊,不过麻烦点:首先,要在可能出现中文乱码的地方加上escape方法

$("#s").load("<%=request.getContextPath()%>/historyQueryAction.do",
     {"method":"query","type":type,"forward":forward,"test":"","customer":escape(customer),"cpmc":escape(cpmc)});

于是传到struts后台的参数变成了%u模式的Unicode编码如在产品名称输入:热轧H型钢就变成了%u70ED%u8F67H%u578B%u94A2,然后再写一个转换函数:

public String unicode2Gbk(String receiveData) {
   StringBuffer rtn = new StringBuffer();
   while (receiveData.length() >= 1) {
    if (receiveData.startsWith("%u")) {
     // 如果开头的是汉字
     String temp = receiveData.substring(0, 6);
     // 截取前六位进行处理
     temp = temp.replace("%u", "");
     // 将编码类型u和web url 传递转换符%去掉
     int j = Integer.parseInt(temp, 16);
     // 将十六进制的字符串转化成整形
     rtn.append((char) j);
     // 将整形强制转成字符串,添加到返回队列里
     receiveData = receiveData.substring(6, receiveData.length());
     // 将剩余的字符串取出来进行下一步处理
    } else {// 如果开头的不是汉字(英文或数字)
     rtn.append(receiveData.substring(0, 1));
     // 直接添加到返回字符队列中
     receiveData = receiveData.substring(1, receiveData.length());
     // 将剩余的字符串取出来进行下一步处理
    }
   }
   return rtn.toString();
}

这样也能解决

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值