JavaWeb中文乱码的种种情况

目录

 

第一种:jsp页面中文乱码

概述

错误代码

乱码展示

解决

正确展示

正确代码

第二种:html页面中文乱码

概述

错误代码

乱码展示

解决

正确展示

正确代码

第三种:通过request.getParameter(name)获取表单提交

概述

错误代码

乱码展示

解决

正确展示

正确代码

第四种:通过request.getParameter(name)获取URL地址中的中文参数

概述

错误代码

乱码展示

解决

正确展示

正确代码

第五种:SpringMVC通过在web.xml文件配置过滤器来处理中文乱码

概述

解决

其他

设置IDEA编码

设置JVM启动参数

设置tomcat编码


第一种:jsp页面中文乱码

概述

即在jsp文件中存在中文,但是运行后,在浏览器显式却是中文乱码。

错误代码

<html>
<body>
    <h2>Hello World!</h2>
    <h1>你好!</h1>
</body>
</html>

乱码展示

解决

在每个jsp文件顶部添加配置:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

正确展示

正确代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
    <h2>Hello World!</h2>
    <h1>你好!</h1>
</body>
</html>

第二种:html页面中文乱码

概述

即在html文件中存在中文,但是运行后,在浏览器显式却是中文乱码。

错误代码

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<h2>Hello World!</h2>
<h1>你好!</h1>
</body>
</html>

乱码展示

解决

在<head>标签中设置中文代码:

<meta charset="UTF-8">

正确展示

正确代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h2>Hello World!</h2>
    <h1>你好!</h1>
</body>
</html>

第三种:通过request.getParameter(name)获取表单提交

概述

在Servlet中通过req.getParameter("username")获取提交的参数是中文乱码。

错误代码

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class SubmitServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get...");
        System.out.println(req.getParameter("username"));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post...");
        System.out.println(req.getParameter("username"));
    }
}

乱码展示

  • post请求乱码

  • get请求乱码

解决

不过本项目可能是环境的原因,需要在tomcat上配置-Dfile.encoding=UTF-8

  • post请求解决

在doPost方法中设置请求的编码格式

// 设置请求的编码格式
req.setCharacterEncoding("UTF-8");
  • get请求解决

这里说的get请求是指method="get",而不是地址上直接写参数。

需要对内容进行转码处理。

// 对获取内容进行转码
String username = req.getParameter("username");
String s = new String(username.getBytes("ISO-8859-1"), "UTF-8");

正确展示

浏览器页面展示:

控制台打印:

正确代码

public class SubmitServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get...");
        // 对获取内容进行转码
        String username = req.getParameter("username");
        String s = new String(username.getBytes("ISO-8859-1"), "UTF-8");
        System.out.println(s);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post...");
        // 设置请求的编码格式
        req.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");
        System.out.println(username);
    }
}

第四种:通过request.getParameter(name)获取URL地址中的中文参数

概述

在浏览器的地址栏中读取中文参数是乱码。

错误代码

public class SubmitServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 对获取内容进行转码
        String username = req.getParameter("username");
        System.out.println(username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

乱码展示

解决

对读取结果进行解码。

// 对获取内容进行转码
String username = req.getParameter("username");
String s = new String(username.getBytes("ISO-8859-1"), "GBK");

正确展示

在浏览器的地址栏直接输入参数。

控制台打印:

正确代码

public class SubmitServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 对获取内容进行转码
        String username = req.getParameter("username");
        String s = new String(username.getBytes("ISO-8859-1"), "GBK");
        System.out.println(s);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

第五种:SpringMVC通过在web.xml文件配置过滤器来处理中文乱码

概述

在web.xml文件中配置过滤器来处理中文乱码。

解决

在web.xml文件中添加如下代码,<filter>标签必须在其他标签之前。

    <!-- 避免中文乱码 -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

就像下面这样:

然后就可以了。

注意上面的配置必须是表单提交,如下这种:

如果是在地址URL上进行,如下这种:

就需要把上面的<param-value>UTF-8</param-value>改为<param-value>GBK</param-value>

其他

设置IDEA编码

设置JVM启动参数

设置参数为:-Dfile.encoding=UTF-8

设置tomcat编码

打开所使用tomcat所在目录下的server.xml文件:

原来的是:

    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"
      />

替换为:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"  useBodyEncodingForURI="true" disableUploadTimeout="true" URIEncoding="UTF-8" />

即如下图所示:

上面几种方法都试了的话,基本上就可以解决javaWeb中的乱码问题了。

本篇文章代码地址

猜你喜欢

转载自blog.csdn.net/cnds123321/article/details/110496042