一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Ajax的Post提交数据程序接受中文乱码解决办法

时间:2014-02-26 编辑:简简单单 来源:一聚教程网

Ajax以POST方式提交,url形式为”url?param=xx¶m2=xx”时,如果传递的参数是中文或日文,后台接收参数将出现乱码,疑似“灏?浼??ㄨ??rdquo;。此时我们需要将url编码成UTF-8。调用javascript方法encodeURI(URIstring),后台接收参数调用URLDecoder.decode(String s,String enc) 解码。
工作中遇到这个问题,起初打算用反射循环给属性转码,考虑到反射效率问题,为避免滥用反射。于是想到BeanUtils工具包赋值前能不能自定义操作呢?还真行。下面给出工作中遇到的实例,页面通过jQuery序列化所有表单使之成为url参数形式字符串,通过Ajax提交。后台Struts封装的FormBean取得所有参数值,调用BeanUtils工具包copyProperties(Object dest, Object orig)方法将FormBean复制到ValueBean,在复制对象属性之前,自定义String编码转换器,转换器中通过URLDecoder.decode(String s,String enc)对Value进行转码。对象的所有属性将会通过自定义转换器过滤转码成中文。

解决此问题的方法非常简单,只需要在JS处理参数时用escape()函数处理一下即可,而且不需要再用unescape()解码,这个方法适合POST和GET方式,具体的Ajax代码这里我不例出,这里给出用escape()函数处理参数时的代码:
 

 代码如下 复制代码
var htmer ="getcode="+escape(getcode)+"&Content="+escape(Content); 

通常我们在处理Ajax的时候会在这里直接获取参数的值,为了使中文参数不是乱码,我们只需要用escape()函数对参数处理下即可。

问题二

当网站页面不是utf-8编码时,ajax提交的中文便会变成乱码,解决方法如下:

找到jquery.js里的

 代码如下 复制代码

 
contentType:application/x-www-form-urlencoded

将它改成

 
contentType:application/x-www-form-urlencoded; charset=UTF-8

就可以了。原因:未指定charset时,jquery使用ISO-8859-1,ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符。jquery的ajax根本没有考虑到国际化的问题,而使用了欧洲的字符集,所以传递中文时才会出现乱码。

例子

js的ajax

 代码如下 复制代码

if(confirm("确定保存吗?")){
 var url = "xxAction.do?method=xxMethod";
 var data = $("form:first").serialize();
 data = encodeURI(data); // 提交数据URL通过encodeURI(URIstring)编码
 $.ajax({
  type:"POST",
  url:url,
  data:data,
  success:function(msg){
   alert(msg);
  }
 });
}

后台程序

 代码如下 复制代码

private void formBeanToValueBean(ZmxgzzmsyVB vb, ZmxgzzmsyFB fb)
  throws Exception {
 // 自定义转换String编码转换器
 ConvertUtils.register(new Converter() {
  public Object convert(Class type, Object value) {
   if (value == null) {
    return null;
   } else {
    String val = "";
    try {
     // 通过URLDecoder.decode(String s,String enc)解码
     val = URLDecoder.decode(value.toString(), "UTF-8");
    } catch (Exception e) {
     e.printStackTrace();
    }
    return val;
   }
  }
 }, String.class);
 BeanUtils.copyProperties(vb, fb);
 ConvertUtils.deregister();
}

热门栏目