request/response解决中文乱码
Request中文乱码问题以及解决方案
补充三个知识点:
- Get是URL编码方式,默认解码格式是iso8859-1编码格式。
- Post是请求体的编码方式,默认解码格式是request容器编码格式。
- 解决request乱码问题是在代码中用
System.out.println(request.getCharacterEncoding());看看接收过来的request是用什么方式编码的。我这里使用的是tomcat10,编码方式是UTF-8,所有就没有出现乱码问题 - 下面提供通用的解决乱码问题,如果还没有解决可以结合上面三条自己尝试解决。
对于Post请求的中文乱码问题:
// 在 HttpServletRequest 接口中提供了一个 setCharacterEncoding() 方法,该方法用于设置 request 请求体解码方式。
request.setCharacterEncoding("utf-8"); //设置request对象的解码方式,这个要在所有获取对象之前
GET 提交时出现的中文乱码:
// 可以先使用错误码表 ISO-8859-1 将用户名重新编码变成字节,然后使用码表 UTF-8 进行解码。再次对 RequestParamsServlet 进行修改
// 因为get请求是在url后面进行传值,url默认的编码就是iso8859-1,传进来的值已经是iso8859-1的编码形式了,所有要按照iso8859-1重新编码成二进制字节,然后按照utf-8的形式在进行解码
name = new String(name.getBytes("iso8859-1"),"utf-8");
Response中文乱码问题以及解决方案
下面通过案例演示乱码问题的产生原因以及解决方式。
@WebServlet("/jsp/test")
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String data = "麻瓜";
PrintWriter out = response.getWriter();
out.println(data);
}
}
当这样不做任何处理的时候,页面显示出来的中文一般都是乱码

由于计算机中的数据都是以二进制形式存储的,因此,当传输文本数据时,会发生字符和字节之间的转换。字符与字节之间的转换是通过查码表完成的,将字符转换成字节的过程称为编码,将字节转换成字符的过程称为解码,如果编码和解码使用的码表不一致,则会导致乱码问题。
知道了原理就很好解决中文乱码问题了,首先在浏览器控制台document.charset查看自己浏览器的默认解码表是啥,我这里使用Edge浏览器默认是GBK,然后在代码中使用response.getCharacterEncoding(),查看自己响应到浏览器的编码是什么,我这里为UTF-8,当然一般都是使用UTF-8进行开发所以响应回去的就是自己编写代码时使用的编码表,上面出现的乱码问题本质就是用UTF-8编码的中文,然后到浏览器中使用GBK进行解码,最后肯定出现乱码问题。
补充两个知识点:
response.setCharacterEncoding(“UTF-8”)的作用是指定服务器响应给浏览器的编码。但是浏览器会以默认的方式进行解码。response.setContentType(“text/html;charset=utf-8”)的作用是指定服务器响应给浏览器的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。
解决办法有三种:
第一种方式以浏览器为标准,将代码中的编码方式改为浏览器的编码方式(不推荐,因为不同的用户浏览器编码方法很可能不一样)
@WebServlet("/jsp/test")
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
// 我这里将响应回到浏览器的编码和浏览器保持一致,就可以解决浏览器乱码问题
response.setCharacterEncoding("gbk"); //设置响应回的中文使用gbk编码,浏览器再使用默认的gbk解码就不会出现问题
String data = "麻瓜";
PrintWriter out = response.getWriter();
out.println(data);
}
}
第二种方式是以代码为标准,通知浏览器中的解码方式改为代码中的编码方式,一般编码方式都是utf-8,这种比第一种好,但是也有人可能使用系统默认的gbk进行编码(不过这种情况下可能就没有乱码问题了( ̄▽ ̄)"),所以也有可能出问题
@WebServlet("/jsp/test")
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); //通知浏览器使用utf-8解码
// 这两种方式效果一样,都是设置浏览器的内容类型,当然不同的浏览器可以效果有些差距,我这里使用的是edge
// response.setHeader("Content-Type", "text/html;charset=utf-8");
String data = "麻瓜";
PrintWriter out = response.getWriter();
out.println(data);
}
}
中间插入一个测试
@WebServlet("/jsp/test")
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println(response.getCharacterEncoding()); // UTF-8,这里是编码默认的
response.setContentType("text/html;charset=gbk");
System.out.println(response.getCharacterEncoding());// gbk
response.setCharacterEncoding("utf-8");
System.out.println(response.getCharacterEncoding());// 我修改后为小写utf-8
String data = "麻瓜";
PrintWriter out = response.getWriter();
out.println(data);
// 最后浏览器控制台document.charset:'UTF-8'
// 如果将setContentType和setCharacterEncoding调换位置,那么最后浏览器控制台document.charset:'GBK'
// 出现这种情况和网上一些说setCharacterEncoding优先级高的有些区别,我这里就以实测为标准,是因为代码顺序决定的优先级,有大佬知道原因的求指导
// 但是如果没有设置setContentType,那么setCharacterEncoding只会修改代码中的编码方式,不会修改浏览器的默认解码方式
}
}
由上面测试可以看出,如果不设置setContentType,那么setCharacterEncoding也不会有效果,那么
理论上统一编码方式为utf-8,这种方式基本可以解决所有问题了
@WebServlet("/jsp/test")
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String data = "麻瓜";
PrintWriter out = response.getWriter();
out.println(data);
}
}
作者: 我吃提子
出处: https://www.cnblogs.com/MuggleP/p/15519568.html
关于作者:我吃提子
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(wangyllong@163.com)咨询.

浙公网安备 33010602011771号