解决Servlet响应输出中文时的乱码问题
HttpServletResponse类的作用
HttpServletResponse类和 和 HttpServletRequest 类一样。
每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。
HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息。
我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
输出时的中文乱码问题
可以通过PrintWriter对象给浏览器输出字符
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.write("hello!!!");
}
但这样写在输出中文的时候就会有乱码问题
writer.write("你好!!!");
我们把hello改成中文,再在通过浏览器访问这个servlet
可以看到输出的 “你好” 变成了 “??”
那是因为响应的编码没有设置为utf-8
通过响应头可以得知响应的编码为ISO-8859-1,这是默认的响应编码
String characterEncoding = response.getCharacterEncoding();
System.out.println(characterEncoding);//ISO-8859-1
我们将响应的编码设置为utf-8
response.setCharacterEncoding("utf-8");
可以看到浏览器还是会输出乱码,不过不是问号了
那是因为浏览器的编码不是utf-8,我们将浏览器的编码设置为utf-8后,输出正常
我们也可以通过响应头直接去设置浏览器的编码,这样就不需要用户手动去设置编码了
response.setHeader("Content-Type","text/html;charset=UTF-8");
以上的代码要写两行代码,很麻烦,其实还有更简洁的方法
response.setContentType("text/html;chaset=utf-8");
这样就只需要一条代码就可以将服务器和客户端都设置为utf-8了,还设置了响应头,就不需要之前的代码了
这个方法一定要在获取流之前调用,否则还是会有乱码