Response输出乱码:
乱码原因:
其实最根本的原因是服务器输出的编码和浏览器解析的编码不一致才导致乱码。
具体分析:
字节乱码:
我们在Servlet中使用字节输出都是response.getOutputStream().write(“中国”.getBytes());这样来输出,根据java基础知识,我
们知道String.getBytes()这个方法会按照系统的默认编码集来对字符串进行编码。也就是说中国这两个字是按照GBK码表来进行编码
成二进制的。当服务器响应时,response缓冲区内容输送到浏览器,有些浏览器默认解析的编码是gbk,有些可能是utf-8,那么按照
GBK码表解析的浏览器不会出现乱码问题,按照UTF-8码表解析的浏览器就会出现中文乱码问题了。
看图:
字符乱码:
Servlet字符方式输出采用response.getWriter().write(“中国”),服务器默认采用的是ISO-8859-1对”中国”进行编码,然而ISO-
8859-1中是没有中文的,所以在码表中查找到的结果就变成了两个问号,浏览器中按照GBK进行解码,解码得到的也还是两个问
号。这时候就要通知服务器按照GBK进行编码,同时通知浏览器也要按照GBK进行解码,因为不可能每个浏览器的默认解码字符集
都是GBK,所以都要通知。
request请求参数乱码:
具体分析:当浏览器发送请求到服务器的时候,如果发送汉字”中国”,浏览器按照GBK进行编码,得到0001 0101,到达服务
器,服务器会默认按照ISO-8859-1进行解码,ISO-8859-1码表中不存在汉字,所以找不到解析出来就是两个问号了。
解决方法:
POST解决方法:
//通知服务器使用GBK编码解析请求中的实体内容,因为get请求时间请求参数放在url上的并不是放在实体中,所以Get请求不能用。
request.setCharacterEncoding(“GBK”);
GET请求解决方法:
Stringcountry = request.getParameter(“country”);
//首先按照ISO-8859-1进行编码,得到00010101 再按照GBK解码就得到中国
Country= new String(country.getBytes(“ISO-8859-1”),”GBK”);
JSP页面乱码:
具体分析:当JSP文件以GBK方式进行保存,其中page指令中设置pageEncoding=”UTF-8”时,就会产生乱码,因为文件读取是
按照GBK进行编码,然后Servlet的翻译引擎按照UTF-8进行解码,这样就会导致乱码。还有一个阶段,就是翻译过来的servlet中是使
用out.write()输出HTML的内容,然而out.write()就等同于response.getWrite().write(),默认使用的是ISO-8859-1的方式进行编码,所以
会产生乱码。
解决方案:JSP文件的保存编码要和pageEncoding指定的编码一致。然而设置了pageEncoding也就相当于设置了翻译出来的
servlet的ContentType。