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。
以上就是在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,原始碼如下:
執行顯示結果如下: (2)在doPost方法的PrintWriter out = response.getWriter();語句前面新增response.setCharacterEncoding("GB2312");的語句 再次執行,結果如下: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); } }
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");的語句,結果如下: