`
lovnet
  • 浏览: 6702003 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Web应用乱码(2)__原因以及解决方案详解

 
阅读更多
---Servlet 中文乱码问题以及解决方案---
Servlet中乱码分为request乱码和response乱码。

一.request中文乱码

request请求分为post和get,产生乱码的原因大致都一样,
但是对于不同的请求方式解决方式不一样。
***Post请求
执行过程:
1.浏览器发出http请求(请求按浏览器的默认码表编码--一般是GB2312)
2.后台Servlet接收到http请求,servlet根据默认码表解析里面的数据(一般是ISO-8859-1)。
乱码原因:
1.发出http请求和解析请求用的码表不一致。
解决方案:
request.setCharacterEncoding("GB2132");
//用同样的码表解析请求
备注:request.setCharacterEncoding 只对Post请求有效
------------------------------------------------------------
***Get请求
过程和原因相同,解决方案不一样。
解决方案:
String username=request.getParameter("name");
String value=null;
value=new String(username.getBytes("ISO-8859-1"),"gb2312");
//先按码表,还原成byte数组,最后再按指定码表生成字符串。

二.response中文乱码

问题引入:
在网上很有效的解决方法是添加:
response.setCharacterEncoding("UTF-8");
解决不了,后来又搜到一条解决方法是:
respnse.setHeader("content-type","text/html;charset=UTF-8");
两句都填上,后来终于解决了这个问题;

Http Response响应 执行过程:
1.web服务端发出Http response响应(响应中的数据可以指定编码)。
2.浏览器接收到Http响应,根据指定码表解码内容(如果不指定编码则会用自己默认的编码)。
乱码原因分析:
1.如果在上面的执行过程中,第一步中的编码和第二步中的编码没有用
同一个码表进行编码和解码,则可能出现问题。
2.同一个数值,在不同码表上对应的值不一样。
解决方案:
response.setCharacterEncoding("UTF-8");
//目的是用于response.getWriter()指定输出的字符流的编码

respnse.setHeader("content-type","text/html;charset=UTF-8");
//目的是为了控制浏览器的行为,指定浏览器用UTF-8进行解码

备注:GBK和GB2312的关系,GBK包含了GB2312。

参考文章:http://blog.csdn.net/xiazdong/article/details/7217022

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics