从此不在担心web开发中的乱码
经常看到有同学针对Tomcat的乱码问题有疑问, 特此梳理:
- 不同Tomcat的版本: Tomcat7及7之前的版本; Tomcat8及8之后的版本;
- 不同的请求乱码: Get请求, Post请求
- Response输出乱码
以上是针对不同的情况, 下面是解决方案
一, Tomcat7及7之前的版本get请求乱码
记住一句话, 出现乱码的时候, 所有的原因都一样: 数据的编码与解码使用了不同的码表导致乱码;
例如: 你用中文语法传递一句话, 只会英语的人用英语来解释, 肯定听不懂.
Tomcat7出现乱码的原理:
1, 客户端发送的数据使用UTF-8
2, Tomcat这个servlet容器在封装request对象的时候, 将接收到的请求的数据以iso8859-1来解码
解决办法
解决方式1: 修改Tomcat的配置文件
解决方式2: 重新解码
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Get请求");
String message = request.getParameter("message");
System.out.println(message);
/*上面的get请求接收参数得到乱码的原理
* 1, 接收到的数据, 都是二进制的形式传输的; (这里数据的编码,客户端使用utf-8)
* 2, 在接收到二进制数据的时候, tomcat以iso8859-1的编码解析的
* 于是, 不同的编解码码表, 导致乱码
* */
String newMessage = new String(message.getBytes(StandardCharsets.ISO_8859_1), "utf-8");
System.out.println("解码后: "+newMessage);
}
--------------------------------------------------------------------
输出结果
--------------------------------------------------------------------
Get请求
ä¸å›½äººè¯´ä¸å›½è¯_get
解码后: 中国人说中国话_get
二, Tomcat7及7之前的版本post请求乱码
解决办法: request.setCharacterEncoding(“utf-8”);
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
System.out.println("Post请求");
String message = request.getParameter("message");
System.out.println(message);
}
--------------------------------------------------------------------
输出结果 - 乱码情况
--------------------------------------------------------------------
Post请求
ä¸å›½äººè¯´ä¸å›½è¯_post
--------------------------------------------------------------------
输出结果 - 增加设置后改善
--------------------------------------------------------------------
Post请求
中国人说中国话_post
三, Tomcat8及8之后的版本get请求乱码
不需要设置
四, Tomcat8及8之后的版本post请求乱码
处理方式和7的方式相同
五, Response输出乱码
方式1:
response.setCharacterEncoding("utf-8"); //设置response的编码码表
response.setHeader("content-type","text/html;charset=utf-8"); //声明给浏览器, 以哪种码表解码
方式2:
response.setContentType("text/html;charset=utf-8"); // 一句的作用, 做了方式1的两件事
下面列举在CSDN上给博友的问题解答
下面是另一个博友给出的质疑
如下是小马哥在查阅Servlet协议源码之后, 给出的回复