Java Web项目中文乱码以及解决办法

一、中文乱码说明

 在Java Web项目中,由于pageEncoding、contentType和charset等编码属性的设置不恰当往往导致显示中文字符会出现乱码问题。例如,在Java Web项目的代码采用UTF-8进行编码,而在浏览器使用ISO-8859-1进行编码,因此会产生中文乱码问题。


二、相关知识

  1.JSP中pageEncoding、contentType以及contentType的charset的理解与区别:

1)pageEncoing:设置JSP源文件本身和响应正文中的字符集编码;

2)contentType:设置JSP原文建和响应正文中的字符集编码以及MIME类型;

3)charset:设置服务器发送给客服端时的内容的字符集编码。

  2.在Java Web项目中,通常情况下,产生中文乱码有三种情况:

第一种情况:调用JSP页面时产生中文乱码;

第二种情况:调用Servlet页面时产生中文乱码;

第三种情况:通过post请求传递包含中文字符的表单时出现中文乱码。

  3.几种常见的编码格式:

1)ISO-8859-1:属于单字节编码,最多能表示字符范围为0-255,应用于英文系列;

2)GB2312/GBK:是汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和ISO-8859-1一致。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字,GBK是兼容GB2312编码;

3)UTF-8:是一种用以解决国际上字符的多字节编码,它对英文使用一个字节,对中文使用三个字节进行编码,是国际上比较通用的字符编码。


三、产生中文乱码的三种不同情况的解决办法

1.调用JSP页面时产生中文乱码

解决方法:首先确认在保存JSP页面时使用的是UTF-8编码格式,然后在JSP页面的头部添加<%@page contentType="text/html"pageEncoding="UTF-8"%>或者将pageEncoding中的值改为UTF-8。

相关实验如下:

(1)新建一个名为Mess_code的JavaWeb项目;

(2)新建一个jsp_mess.jsp文件,源代码如下:

<%@page contentType="text/html" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP中的中文乱码问题</title>
    </head>
    <body><h1>看看这里有没有中文乱码问题</h1></body>
</html>

运行显示结果如下: 

                                 


(3)将<%@page contentType="text/html" pageEncoding="ISO-8859-1"%>改为<%@page contentType="text/html" pageEncoding="UTF-8"%>重新运行结果如下:
                                           
                                             
2.调用Servlet页面时产生中文乱码
解决方法1:在Servlet使用response对象输出中文字符之前,先添加语句response.setContentType("text/html;charset=GB2312");目的是为了控制浏览器的行为,即是控制浏览器采用UTF-8进行解码。
解决方法2:在Servlet使用response对象输出中文字符之前,先添加语句
response.setCharacterEncoding("GB2312");目的是将response对象中的数据以GB2312格式解码后发向浏览器。这两种方法能使Servlet的编码与解码格式统一,解决中文乱码问题。
相关实验如下:

(1)新建一个名为Servlet_mess.java的Servlet,源代码如下:

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

@WebServlet(urlPatterns = {"/Servlet_mess"})
public class Servlet_mess extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String data = "博客";  
        out.println(data); 
    }
}
运行显示结果如下:
                                                                                   (2)在doPost方法的PrintWriter out = response.getWriter();语句前面添加response.setCharacterEncoding("GB2312");的语句
再次运行,结果如下:
 


3.通过post请求传递包含中文字符的表单时出现中文乱码
解决方法:在Servlet或者JSP接收post提交的中文字符参数之前,使用request.setCharacterEncoding("UTF-8")设置接收参数的内容格式为UTF-8编码。
(1)新建一个post_mess.jsp的文件,源代码如下:
<%@ page language="java" pageEncoding="utf-8"%>
<html>
<head>
<title>输入表单</title>
</head>
<body>
<form  method="post" action="show">
      姓名:<input type="text" name="name"/><br/>
      爱好:<input type="text" name="hobby"/><br/>
     <input type="submit" name="submit" value="提交"/>
</form>
</body>
</html>
(2)新建一个名为show.java的Servlet,源代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = {"/show"})
public class show extends HttpServlet {
   @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("GB2312");
        String name = request.getParameter("name");
        String hobby = request.getParameter("hobby");
        PrintWriter out = response.getWriter();
        out.println("<html><head>");
        out.println("<title>显示考生考试信息</title></head>");
        out.println("<body>");
        out.println("<h4>你的信息:</h4>");
        out.println("姓名:"+name+"</br>");
        out.println("爱好:"+hobby+"</br>");
        out.println("</html>");
    }
}
(3)运行post_mess.jsp,并用输入中文字符填写表单,点击“提交”
填写表单页面如下:

提交结果如下:
                                                 

(4)在doPost方法的response.setCharacterEncoding("GB2312");语句前面添加request.setCharacterEncoding("UTF-8");的语句,结果如下:




以上就是在Java Web项目中出现中文乱码的一些常见情况以及解决办法,希望能对大家有所帮助!






















  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解决 Java Web 项目中中文乱码的问题,可以考虑以下几个方法: 1. 设置字符编码:在 JSP 页面中,可以通过设置 `pageEncoding` 属性来指定页面编码,例如 `<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>`。在 Java 代码中,可以通过 `request.setCharacterEncoding("UTF-8")` 来设置请求的编码。 2. 设置响应头:在 Servlet 中,可以通过 `response.setContentType("text/html; charset=UTF-8")` 来设置响应的编码。 3. 使用过滤器:可以通过编写过滤器来统一处理编码问题,例如: ```java public class EncodingFilter implements Filter { private String encoding = "UTF-8"; public void init(FilterConfig config) throws ServletException { if (config.getInitParameter("encoding") != null) { encoding = config.getInitParameter("encoding"); } } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(encoding); resp.setContentType("text/html; charset=" + encoding); chain.doFilter(req, resp); } public void destroy() { } } ``` 然后在 web.xml 中配置过滤器: ```xml <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.example.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 4. 采用统一编码:可以将项目中的所有文件都采用统一的编码,例如 UTF-8。在 Eclipse 中,可以通过设置文件编码来实现。 以上是一些常见的解决方法,具体选择哪种方法取决于具体情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值