接口参数中文乱码(MYSQL+STRUTS)
2014-04-04 15:22
225 查看
前几天做一个项目的时候,遇到了传过来的中文参数是乱码的问题:
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(),效率不高,所以,只能是在参数很少,而且是中文的情况下使用。
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(),效率不高,所以,只能是在参数很少,而且是中文的情况下使用。
相关文章推荐
- 处理特殊log语句的java函数
- java 发送邮件测试例子
- 扩展SpringMVC以支持更精准的数据绑定1
- eclipse常用快捷键 --10大常用快捷键 可以提高不小的工作效率哦
- java static 与 线程 共用同步问题
- 工作的小经验之2:关于java和面向对象
- 什么是堆栈追踪(StackTrace)?如何利用StackTrace对程序进行调试?
- Eclipse中web项目引用 其他项目
- 重装Eclipse、离线安装ADT、Android SDK
- JAVA中Final的用法
- Java开发者应该列入年度计划的5件事
- JAVA动态代理 和 Spring AOP 4种通知的简单实现
- JAVA语言中的反射机制
- java多线程学习(二)——wait/notify
- Java中byte与16进制字符串的互相转换
- 对SpringIOC的理解(3)
- Java开发者应该列入年度计划的5件事
- java核心技术I
- SSL:javax.net.ssl.SSLException: Inbound closed before receiving peer's close_notify: possible trunca
- Eclipse ALT+/失效解决方案