一、乱码分析
- 在Tomcat10.1.7中,向响应体中放入的数据默认使用了工程编码 UTF-8
- 浏览器在接收响应信息时,使用了不同的字符集或者是不支持中文的字符集就会出现乱码
二、乱码演示
服务端通过response对象向响应体添加数据
浏览器接收数据解析乱码,因为浏览器不知道用什么编码表来进行解码,于是就默认使用GBK进行解码了。
二、乱码解决
方式1
手动设定浏览器对本次响应体解析时使用的字符集(不推荐)
edge和 chrome浏览器没有提供直接的比较方便的入口,不方便
方式2
后端通过设置响应体的字符集和浏览器解析响应体的默认字符集一致(不推荐)
但是我们不推荐这样做,因为我们做好的项目,前端是用什么客户端软件来访问我们的项目是不确定的,有可能用的并不是我们国内的语言,即别的国家的浏览器可能没有GBK编码表,那么就又出现乱码问题了,因此我们在后端这块想办法去适应前端,这种解决方式其实并不是很好,因为前端是变化的。
方式3
通过设置Content-Type响应头,告诉浏览器以指定的字符集解析响应体(推荐)
此时客户端收到了这个响应头,客户端就知道了应该用UTF-8这个字符集来解析响应体,然后将响应体也是用UTF-8解码即可。
这种方式是推荐的,这样无论你使用什么浏览器,浏览器的默认字符集是什么都无所谓了,客户端一定要遵循我指定的字符集对响应体进行解码就行了。
这个方法能成功的原因在于在Tomcat10.1.7中,向响应体中放入的数据默认使用了工程编码 UTF-8。但是如果使用其他版本的Tomcat,有可能就不一样了,因此最推荐的办法是两者都加上。
// 设置响应体使用UTF-8编码
resp.setCharacterEncoding("UTF-8");
// 设置Content-Type响应头,告诉客户端用UTF-8解码
resp.setContentType("text/html;charset=UTF-8");