1. 程式人生 > 其它 >Java Servlet的request/response中文亂碼問題的解決方案

Java Servlet的request/response中文亂碼問題的解決方案

技術標籤:JavaWeb

大家在使用JavaServlet開發網站的時候經常會遇到中文亂碼問題,不管是請求(request)還是響應(response)的過程,這裡我們分別給出對應的解決方案。

Request中文亂碼問題以及解決方案

在填寫表單資料時,難免需要輸入中文,如使用者名稱和公司名稱等。如果將 servletDemo02 專案中表單頁面的的使用者名稱輸入為“黑馬程式設計師”,則提交後控制檯的顯示將如圖 1 所示。

執行結果
圖 1 執行結果


從圖1中可以看出,當輸入的使用者名稱為中文時,出現了“é??é??...”的亂碼。本節將介紹如何處理請求引數中的中文亂碼。


在 HttpServletRequest 介面中提供了一個 setCharacterEncoding() 方法,該方法用於設定 request 物件的解碼方式。接下來對 RequestParamsServlet 進行修改,在第 7~8 行程式碼之間新增如下程式碼:

request.setCharacterEncoding("utf-8"); //設定request物件的解碼方式

重啟 Tomcat 伺服器,再次輸入中文“黑馬程式設計師”並提交表單資訊後,控制檯顯示的資訊如圖 2 所示。

執行結果
圖 2 執行結果


需要注意的是,這種解決亂碼的方式只對 POST 方式有效,而對 GET 方式無效。如果將 form.html 檔案中 method 屬性的值改為 GET,重新訪問 form.html 頁面並填寫中文資訊,則控制檯依然會出現如圖 1 所示的亂碼問題。


為了解決 GET 方式提交表單時出現的中文亂碼問題,可以先使用錯誤碼錶 ISO-8859-1 將使用者名稱重新編碼,然後使用碼錶 UTF-8 進行解碼。再次對 RequestParamsServlet 進行修改,在第 9~10 行程式碼之間增加一行程式碼,如下所示:

name = new String(name.getBytes("iso8859-1"),"utf-8");

重啟 Tomcat 伺服器,再次訪問 form.html 網頁,輸入中文使用者名稱“黑馬程式設計師”,這時,控制檯顯示的資訊將不會出現亂碼。

Response中文亂碼問題以及解決方案

由於計算機中的資料都是以二進位制形式儲存的,因此,當傳輸文字資料時,會發生字元和位元組之間的轉換。字元與位元組之間的轉換是通過查碼錶完成的,將字元轉換成位元組的過程稱為編碼,將位元組轉換成字元的過程稱為解碼,如果編碼和解碼使用的碼錶不一致,則會導致亂碼問題。下面通過案例演示亂碼問題的產生原因以及解決方式。

在 servletDemo02 專案中新建一個名稱為 com.mengma.response 的包,在該包中新建一個名為 ChineseServlet 的類,在類中定義一箇中文字串,然後使用字元輸出流輸出,如下所示。

package com.mengma.servlet;

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

public class ChineseServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)throws            ServletException, IOException {
        String data = "中國";
        PrintWriter out = response.getWriter();
        out.println(data);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)throws     ServletException, IOException {
        doGet(request, response);
    }
}

啟動 Tomcat 伺服器,在瀏覽器的位址列中輸入地址 http://localhost:8080/servletDemo02/ChineseServlet 訪問 ChineseServlet,瀏覽器的顯示結果如圖 3 所示。

執行結果
圖 3 執行結果


從圖 1 中可以看出,瀏覽器顯示的內容是“??”,說明發生了亂碼。實際上此處產生亂碼的原因是 response 物件的字元輸出流在編碼時採用的字元碼錶是 ISO-8859-1,該碼錶不相容中文,會將“中國”編碼為 63 63(在 ISO-8859-1 的碼錶中查不到的字元就會顯示 63)。當瀏覽器對接收到的資料進行解碼時,會採用預設的碼錶 GB2312,將 63 解碼為?,因此,瀏覽器將“中國”兩個字元顯示為“??”,具體分析如圖 4 所示。

編碼錯誤分析
圖 4編碼錯誤分析


為了解決上述編碼錯誤,HttpServletResponse 物件提供了兩種解決亂碼的方式,具體如下。

第一種方式:

response.setCharacterEncoding("utf-8"); //設定 HttpServletResponse使用utf-8編碼
response.setHeader("Content-Type", "text/html;charset=utf-8"); //通知瀏覽器使用utf-8解碼

第二種方式:

response.setContentType("text/html;charset=utf-8"); //包含第一種方式的兩個功能

在通常情況下,為了使程式碼更加簡潔,一般會採用第二種方式。接下來對 ChineseServlet 進行修改,在第 7~8 行程式碼之間加入第二種方式的程式碼,重新啟動 Tomcat 伺服器並使用瀏覽器訪問 ChineseServlet,瀏覽器顯示出了正確的中文字元,如圖 5 所示。

執行結果