其他分享
首页 > 其他分享> > 几张图带你理解Web开发的中文乱码问题

几张图带你理解Web开发的中文乱码问题

作者:互联网

在Web开发初学的时候,常常会遇到web的中文乱码问题,非常痛苦…image-20210610123629687

image-20210610123715202

当时我就在网上胡搜,就不断复制黏贴,就搞定了,也没搞清楚个明白。image-20210610123939965

乱码原因的本质

Tomcat服务器默认用ISO-8859-1进行编码,我们写了中文以后,ISO-8859-1编码后,发送给客户端(浏览器),客户端(浏览器)一脸懵逼用GBK的解码规则进行解码,结果就乱码了…image-20210610123334221

解决方案

从难到简,一步一步剖析后面背后的有趣过程。

解决方案1.0

Tomcat用ISO-8859进行编码,浏览器用GBK解码,我们让其统一就可以了,第一个方法就是让Tomcat用GBK进行编码

image-20210610124219961

image-20210610124305662

代码实现

@WebServlet("/Test01")
public class Test01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("GBK");//设置编码格式!!!
        final PrintWriter writer = resp.getWriter();
        writer.write("你好");
    }
}

解决方案1让服务器去妥协成GBK解码,万一浏览器用UFT-8编码岂不是很尴尬?

解决方案2.0

所以我们得告诉浏览器,我用的是UTF-8,还是GBK,这样就不会出现不一致的情况,那么如何实现呢?image-20210610125613373

HTTP协议的响应头里有这个规定:

image-20210610125436816

这个请求头信息决定浏览器将以什么形式、什么编码读取这个文件。

所以我们就可以调用setHeader(设置响应头)的函数,来指定Content-Type的内容,同时还能指定字符流的编码格式,这样服务器和客户端都能统一。

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //resp.setCharacterEncoding("UTF-8");下面一行,就可以告诉字符流,我们的编码格式是UTF-8,这行可以省略
        resp.setHeader("Content-type","text/html;charset=UTF-8");//第一个是响应头的名称,第二个是值
        final PrintWriter writer = resp.getWriter();
        writer.write("你好!!");
    }

image-20210610125850494

Tomcat还封装了一个函数,resp.setContentType(),可以直接修改ContentType,懒人就可以少写一个参数了。

resp.setContentType("text/html;charset=UTF-8");

最终方案

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        final PrintWriter writer = resp.getWriter();
        writer.write("你好!!");
 }

标签:Web,UTF,编码,resp,writer,GBK,乱码,浏览器,图带
来源: https://blog.csdn.net/TKKDOUZI/article/details/117776560