1. 程式人生 > 其它 ><筆記>Web中文亂碼解決方案與原理

<筆記>Web中文亂碼解決方案與原理

在Web開發初學的時候,常常會遇到web的中文亂碼問題,非常痛苦...

當時我就在網上胡搜,就不斷複製黏貼,就搞定了,也沒搞清楚個明白。

亂碼原因的本質

Tomcat伺服器預設用ISO-8859-1進行編碼,我們寫了中文以後,ISO-8859-1編碼後,傳送給客戶端(瀏覽器),客戶端(瀏覽器)一臉懵逼用GBK的解碼規則進行解碼,結果就亂碼了...

解決方案

從難到簡,一步一步剖析後面背後的有趣過程。

解決方案1.0

Tomcat用ISO-8859進行編碼,瀏覽器用GBK解碼,我們讓其統一就可以了,第一個方法就是讓Tomcat用GBK進行編碼

程式碼實現

@WebServlet("/Test01")
public class Test01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("GBK");//設定編碼格式!!!
        final PrintWriter writer = resp.getWriter();
        writer.write("你好");
    }
}

解決方案1讓伺服器去妥協成GBK解碼,萬一瀏覽器用UFT-8編碼豈不是很尷尬?

解決方案2.0

所以我們得告訴瀏覽器,我用的是UTF-8,還是GBK,這樣就不會出現不一致的情況,那麼如何實現呢?

HTTP協議的響應頭裡有這個規定:

這個請求頭資訊決定瀏覽器將以什麼形式、什麼編碼讀取這個檔案。

所以我們就可以呼叫setHeader(設定響應頭)的函式,來指定Content-Type的內容,同時還能指定字元流的編碼格式,這樣伺服器和客戶端都能統一。

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //resp.setCharacterEncoding("UTF-8");下面一行,就可以告訴字元流,我們的編碼格式是UTF-8,這行可以省略
        resp.setHeader("Content-type","text/html;charset=UTF-8");//第一個是響應頭的名稱,第二個是值
        final PrintWriter writer = resp.getWriter();
        writer.write("你好!!");
    }

Tomcat還封裝了一個函式,resp.setContentType(),可以直接修改ContentType,懶人就可以少寫一個引數了。

resp.setContentType("text/html;charset=UTF-8");

最終方案

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        final PrintWriter writer = resp.getWriter();
        writer.write("你好!!");
 }