1. pageEncoding: <%@ page pageEncoding="UTF-8"%>html
jsp頁面編碼: jsp文件自己的編碼java
2. contentType: <%@ page contentType="text/html; charset=UTF-8"%>web
web頁面顯示編碼: jsp的輸出流在瀏覽器中顯示的編碼數據庫
3. html頁面charset: <META http-equiv="Content-Type" content="text/html; charset=UTF-8">瀏覽器
web頁面輸入編碼: 輸入框輸入的字體編碼 服務器
4. setCharacterEncoding: request.setCharacterEncoding(),response.setCharacterEncoding()app
web服務器輸入的請求流: web server相應瀏覽器的請求數據jsp
5. setContentType: response.setContentType()字體
web服務器輸出的響應流: web server相應瀏覽器的輸出數據ui
他們之間的相互影響和做用域,以及前後做用順序:
1. pageEncoding: 只是指明瞭 JSP 頁面自己的編碼格式,跟頁面顯示的編碼沒有關係; 容器在讀取(文件)或者(數據庫)或者(字符串常量)時將起轉化爲內部使用的 Unicode,而頁面顯示的時候將內部的Unicode轉換爲contentType指定的編碼後顯示頁面內容;若是pageEncoding屬性存在,那麼JSP頁面的字符編碼方式就由pageEncoding決定,不然就由contentType屬性中的charset決定,若是charset也不存在,JSP頁面的字符編碼方式就採用默認的ISO-8859-1。
2. contentType: 指定了MIME類型和JSP頁面迴應時的字符編碼方式。MIME類型的默認值是「text/html」;字符編碼方式的默認值是「ISO-8859-1」. MIME類型和字符編碼方式由分號隔開;
3. pageEncoding和contentType的關係:
(1). pageEncoding的內容只是用於jsp輸出時的編碼,不會做爲header發出去的; 是告訴web Server jsp頁面按照什麼編碼輸出,即web服務器輸出的響應流的編碼;
(2). 第一階段是jsp編譯成.java,它會根據pageEncoding的設定讀取jsp,結果是由指定的編碼方案翻譯成統一的UTF-8 JAVA源碼(即.java).
(3). 第二階段是由JAVAC的JAVA源碼至java byteCode的編譯,不論JSP編寫時候用的是什麼編碼方案,通過這個階段的結果所有是UTF-8的encoding的java源碼.JAVAC用UTF-8的encoding讀取java源碼,編譯成UTF-8 encoding的二進制碼(即.class),這是JVM對常數字串在二進制碼(java encoding)內表達的規範.
(4). 第三階段是Tomcat(或其的application container)載入和執行階段二的來的JAVA二進制碼,輸出的結果,也就是在客戶端見到的,這時隱藏在階段一和階段二的參數contentType就發揮了功效.
4. 和contentType效果同樣的設置方式還有html頁面charset, response.setCharacterEncoding(),response.setContentType(),response.setHeader();
response.setContentType(),response.setHeader(),優先級最好;
其次是response.setCharacterEncoding();
再者是<%@page contentType="text/html; chareset=gbk"%>;
最後是<meta http-equiv="content-type" content="text/html; charset=gb2312" />.
5. web頁面輸入編碼: 在設置頁面編碼<%@page contentType="text/html; chareset=gbk"%>的同時,也就指定了頁面的輸入編碼;若是頁面的顯示被設置爲UTF-8,那麼用戶全部的頁面輸入都會按照UTF-8編碼; 服務器端程序在讀取表單輸入以前要設定輸入編碼; 表單被提交後,瀏覽器會將表單字段值轉換爲指定字符集對應的字節值,而後根據 HTTP 標準 URL編碼方案對結果字節進行編碼.可是頁面須要告訴服務器當前頁面的編碼方式;request.setCharacterEncoding(),能修改Serverlet獲取請求的編碼,response.setCharacterEncoding(),能修改Serverlet返回結果的編碼.