前几天做一个项目的时候,遇到了传过来的中文参数是乱码的问题:
http://localhost:8081/my_service/getInData?className=美女&pageNo=1&pageSize=3
在服务器端接受到的className=????。
显示百度、google之后,说是数据库编码的问题,于是查询数据库:
1、SHOW VARIABLES LIKE "%char%"
没有问题,如果这里有不是utf8的可以执行SET character_set_server = utf8修改。
2、继续查询 SHOW VARIABLES LIKE "%coll%"
也没有发现问题,继续往下。
3、查询表里面字段的编码格式 SHOW FULL COLUMNS FROM pics
也没有问题,数据库的可能性排除。
然后,想到用的是struts2,于是找到struts2的配置文件,在里面加入<constant name="struts.i18n.encoding" value="utf-8"></constant>,将编码设置成utf-8,再测试,还是不行。
最后,在后台代码中加入
this.response.setContentType("text/html;charset=utf-8");
this.response.setCharacterEncoding("utf-8");
this.request.setCharacterEncoding("utf-8");
在测试,还是不行。。。。郁闷了一中午。
下午,求救于qq群。
有一个人说加入 URLDecoder.decode(str,"utf-8");这个,意思是页面是用encodeURI进行转码的,是把汉字转换成
¥%#¥%¥%¥%¥%¥%¥%#¥%#¥% 类似与这个玩意的东西,后台在用URLDecoder.decode(str,"utf-8"); 转回来,测试,还是不行。
奔溃ing。。。。
最后,又有一个说是页面默认的编码是ISO-8859-1,而接口中没有设置编码格式,所以不行,需要在后台代码中加入如下代码
className = new String(className.getBytes("ISO-8859-1"), "utf-8");
将传过来的参数进行转码。
测试,成功!
PS:这种方法虽然可以解决问题,但是它每传过来一个参数,就要进行一次new String(),效率不高,所以,只能是在参数很少,而且是中文的情况下使用。