1. 程式人生 > >Java Web專案中文亂碼以及解決辦法

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專案中出現中文亂碼的一些常見情況以及解決辦法,希望能對大家有所幫助!