[问题解决] 乱码问题 奇葩解决方法

在做边学边实践微信服务号时,遇到了乱码问题,奇葩的是后台System.out.println()是正确的,到了数据库也是正确的,但是前端页面一刷新,数据库就变成了乱码.这个问题一直困扰着我,直到发现我使用的ajax提交方法是GET  这才意识到问题出现在哪里,果然换成POST,问题解决.

 

GET:没有请求实体,含有数据的url都在请求头里面

请注意,其实这里进行了两次编码,第一次是使用UTF8,第二次使用iso-8859-1编码成能在网络上传输二进制101010….
现在问题来到了服务器端,每种服务器默认的编码方式都可能不同,比如tomcat默认编码就是iso-8859-1, 而resin默认编码是utf-8
按道理服务器端也会做两次的解码动作,第一次是对二进制内容的iso-8859-1的解码,第二次是使用服务器默认的编码对数据进行解码,
因此我们使用request.getParameter(“name”)得到的数据是经过两次解码的.
当tomcat使用iso-8859-1对数据进行第二次解码时,因为对应客户端编码是utf8,
因此我们使用request.getParameter(“name”)就肯定乱码.
如果我们不去改变tomcat的默认编码,可以使用
new String(request.getParameter(“name”).getBytes(“iso-8859-1″), “utf-8″);手工重新解码.
request.setCharacterEncoding(“utf-8″)这种方式对于get方式提交数据是无效的,
但是对post方式提交数据却是有效的.因为get没有request body.

通常的做法还是修改tomcat的默认编码:
在server.xml中的connector加上URIEncoding=”UTF-8″即可

 

POST:方式

post方式提交的数据也是必须进行编码的.
如果form所在html文件指定了编码,就使用那个编码进行url编码.

总结:为了防止出现乱码,一般系统相关的文件都设成utf8格式,web服务器,Java服务器,数据库的编码格式都设为utf8.这样一般比较少出现乱码问题.
还有就是尽量使用post方式提交数据,一个是因为url的长度是有限制的,而get方式是将数据拼接到url上的.

posted @ 2016-12-11 21:34  DemonGao  阅读(121)  评论(0编辑  收藏  举报