Servlet的doXXX方法中,以doGet(HttpServletRequest request,HttpServletResponse response);方法为例,其中的response参数具有getOutputStream()方法和getWriter()方法。
1、在Windows平台下,使用下面的语句
response.getOutputStream().write("abcd".getBytes());
或
response.getOutputStream().write("中文无乱码".getBytes());
输出响应内容时,在客户端浏览器中显示,均不会产生乱码,原因是:
String类的getBytes()方法,不含参数时,默认使用特定平台(此处为Windows)上的编码方案(此处为GB2312,是GBK编码的子集),而浏览器也是默认使用特定平台上的解码方案,所以不会产生乱码。
2、在Windows平台下,使用下面的语句
response.getOutputStream().write("中文有乱码".getBytes("utf-8"));
输出响应内容时,在客户端浏览器中显示,会产生乱码,原因如1.解决这个问题的办法是添加下面的语句:
response.setHeader("Content-Type", "text/html;charset=utf-8");
3、 在Windows平台下,使用下面的语句
response.getWriter().write("中文有乱码");
输出响应内容时,在客户端浏览器中显示,会产生乱码,原因是:
上述语句没有指定服务器端的编码方案,tomcat容器会默认使用ISO8859-1编码方案对writer()方法中的字符串进行编码,而浏览器端是特定平台的解码方案,所以会产生乱码,可能是多个?符号,因为ISO8859-1查不到编码方案时,会编码成?,而其他编码方案都是兼容ISO8859-1的,所以能够显示发过来的?。
解决的办法是分别设置服务器端的编码方案和浏览器端的解码方案:
//设置服务器端编码方案
response.setCharacterEncoding("utf-8");
//设置浏览器端解码方案
response.setHeader("Content-Type", "text/html;charset=utf-8");
另外:
使用下面的语句
response.setHeader("Content-Type", "text/html;charset=utf-8");
此时,因为设置浏览器解码方案了,服务器会自动使用对应的编码方案进行编码,也就是说,上面一句代码的作用,其实包含了3中的两句解决方案的作用。
最后,其实第1、2、3中所有的问题,可以用下面一句代码全部解决:
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");