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 将它改成 |
就可以了。原因:未指定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(); } |