一、中文乱码说明
在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");的语句,结果如下: