天天看點

再說JSP中pageEncoding& charset

在《Java Web項目中的國際化》一文中,筆者在第二點中提到了在JSP的charset和pageEncoding。同時在進行Java web國際化開發時,務必指明pageEncoding和charset屬性。

<%@ pagelanguage="java"contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> 

然而,這二者的差別又是什麼呢?指明其中的一個屬性難道還不夠麼?呃……不得不說的是——真不夠!這是因為JSP需要進行兩次編碼,三個階段。

再說JSP中pageEncoding&amp; charset

第一階段會使用pageEncoding的設定值将 JSP編譯成Servlet。JSP在伺服器上是要先被編譯成Servlet的,pageEncoding="?"的作用就是告訴JSP編譯器,在将JSP檔案編譯成Servlet時使用什麼編碼方式。一般情況下,JSP内部定義的字元串出現亂碼,通常都是由于該參數設定錯誤引起的。

第二階段是javac對Java源碼編譯至Java byte code的過程,不論JSP編寫時候用的是什麼編碼方案,JAVAC都使用UTF-8的encoding讀取java源碼,編譯成UTF-8encoding的二進制碼(即.class),這是JVM對常數字串在二進制碼(java encoding)内的表達規範。

第三階段是Tomcat(或其他ApplicationContainer)載入和執行之前産生的Java二進制碼,在client端進行展示。這時charset就開始發揮作用。在未使用response.setCharacterEncoding方法時,用該參數指定對伺服器響應進行重新編碼的編碼。

charset屬性指定了MIME類型和JSP頁面回應時的字元編碼方式。MIME類型的預設值是“text/html”; 字元編碼方式的預設值是“ISO-8859-1”。

再次回到之前假設的問題,我們隻設定charset。<%@page contentType="text/html;charset=utf-8" %>

這時用GBK在JSP頁面上寫入<% out.print(“國際化”); %>,問:伺服器是否正确顯示“國際化”呢?我隻能說結果不得而知……但如果修改為

<%@ pagecontentType="text/html;charset=utf-8"pageEncoding="GBK"%> 我立刻就可以拍胸脯說go live啦!

至此,我們應該可以用如下兩句話作為本文結案陳詞了。

1. pageEncoding用來指定JSP編譯成Servlet時使用的編碼

2. charset用來指定請求伺服器後傳回内容的字元編碼