一、中文乱码说明
在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。
以上就是在Java Web项目中出现中文乱码的一些常见情况以及解决办法,希望能对大家有所帮助!相关实验如下:
(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的文件,源代码如下:
(2)新建一个名为show.java的Servlet,源代码如下:<%@ 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>
(3)运行post_mess.jsp,并用输入中文字符填写表单,点击“提交”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>"); } }
填写表单页面如下:
提交结果如下:
(4)在doPost方法的response.setCharacterEncoding("GB2312");语句前面添加request.setCharacterEncoding("UTF-8");的语句,结果如下: