一、创建ChineseServlet
public class ChineseServlet extends HttpServlet {private static final long serialVersionUID = -4526004697502051528L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String data = "中国";PrintWriter out = response.getWriter();out.println(data);}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
二、分析乱码原因
http://localhost:8080/chapter04/ChineseServlet
response.getWriter()得到的字符输出流默认采用ISO-8859-1编码,该码表编码范围是0x00-0xFF,明显兼容不了中文,查不到的字符就编码为63,当浏览器解码时,默认采用GB2312,将63解码为?(因为在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII)
那么把输出流的编码设为GB2312,行不行呢?
response.setCharacterEncoding("gb2312"); String data = "中国"; PrintWriter out = response.getWriter(); out.println(data);
行是行了,但我们一般采用utf-8,因为utf-8更通用,表示的字符更多。所以
response.setCharacterEncoding("utf-8");
再进行测试
乱码,刚才说了浏览器默认是gb2312,所以得通过某种方式告诉浏览器,我发过来的流是utf-8编码的哦,那么浏览器就给你utf-8解码。什么方式呢?设置响应消息头
response.setHeader("Content-Type", "text/html;charset=utf-8");
三、两种方式解决中文乱码
1.
response.setCharacterEncoding("utf-8");response.setHeader("Content-Type", "text/html;charset=utf-8");
分析了源码,发现第一行代码不要也可以,于是验证,结果也是正确的。
2.更简便的方式,包含第一种方式的两个功能
response.setContentType("text/html;charset=utf-8");