前言
首先,我们得了解为什么会Servlet乱码。
在进行Java web的开发时,我们最常用的是Tomcat服务器。
浏览器默认的编码是ANSI(大陆地区就是GBK),而Tomcat在8及之前的版本都是ISO-8859-1,我使用的是Tomcat10.0.23(编码以及变成了UTF-8.
因此默认编码不统一,就会导致乱码。
不同于HTML页面与JSP页面,他们都能很方便的设置编码(当然Servlet其实也方便),并且编码都在十分显眼的位置,不容易忽视。例如HTML可以在中设置编码
<meta charset=“UTF-8”>
而JSP更是可以直接在标签属性中设置
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
而Servlet大多数时候,我们只用它来进行逻辑处理和跳转功能,这也就容易让我们忽视其中的编码问题。
解决方案
有时,我们会想要简单的测试一个项目是否成功运行,或者做一点简单的逻辑处理。
因此这时候选择Servlet直接输出是个不错的主意。
我们通常会这样写
PrintWriter writer = response.getWriter();
String str=“<h1>HelloWorld!你好世界”;
writer.println(str);
但如果你这时候运行Tomcat服务器,你会发现你的中文无法正常显示。
这时候我们只需要在项目中加上
response.setContentType(“text/html;charset=utf-8”);
这条信息会被直接加在页面的响应头中,浏览器收到之后也会按照指定的编码进行解码。
如此一来,Servlet乱码问题就解决了。
不过,值得注意的一点是,
如果你仅仅加入这样的代码,不加入编码方式
response.setContentType(“text/html”);
最后的响应头中任然会自动出现charset=UTF-8 (Edge浏览器亲测),可惜目前还不明白是什么原理。