<笔记>Tomcat&JavaWeb开发中文乱码解决方案与原理

2021/6/10 14:21:28

本文主要是介绍<笔记>Tomcat&JavaWeb开发中文乱码解决方案与原理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在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("你好!!");
 }


这篇关于<笔记>Tomcat&JavaWeb开发中文乱码解决方案与原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程