1. pageEncoding:<%@ page pageEncoding="UTF-8"%>
jsp頁面編碼: jsp文件本身的編碼
2. contentType: <%@ page contentType="text/html; charset=UTF-8"%>
web頁面顯示編碼:jsp的輸出流在瀏覽器中顯示的編碼
3. html頁面charset:
web頁面輸入編碼: 輸入框輸入的字體編碼
4. setCharacterEncoding:request.setCharacterEncoding(),response.setCharacterEncoding()
web服務器輸入的請求流: web Server相應瀏覽器的請求數(shù)據(jù)
5 .setContentType:response.setContentType()
web服務器輸出的響應流: web Server相應瀏覽器的輸出數(shù)據(jù)
他們之間的相互影響和作用域,以及先后作用順序
1. pageEncoding: 只是指明了 JSP 頁面本身的編碼格式钦奋,跟頁面顯示的編碼沒有關系;
容器在讀取(文件)或者(數(shù)據(jù)庫)或者(字符串常量)時將起轉(zhuǎn)化為內(nèi)部使用的 Unicode,而頁面顯示的時候?qū)?/p>
內(nèi)部的Unicode轉(zhuǎn)換為contentType指定的編碼后顯示頁面內(nèi)容;
如果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的內(nèi)容只是用于jsp輸出時的編碼秃励,不會作為header發(fā)出去的; 是告訴web Server
jsp頁面按照什么編碼輸出,即web服務器輸出的響應流的編碼;
2. 第一階段是jsp編譯成.java,它會根據(jù)pageEncoding的設定讀取jsp围辙,結果是由指定的編碼方案翻譯
成統(tǒng)一的UTF-8 JAVA源碼(即.java).
3. 第二階段是由JAVAC的JAVA源碼至java byteCode的編譯我碟,不論JSP編寫時候用的是什么編碼方案,
經(jīng)過這個階段的結果全部是UTF-8的encoding的java源碼.JAVAC用UTF-8的encoding讀取
java源碼酌畜,編譯成UTF-8 encoding的二進制碼(即.class)怎囚,這是JVM對常數(shù)字串在二進制碼
(java encoding)內(nèi)表達的規(guī)范.
4. 第三階段是Tomcat(或其的application container)載入和執(zhí)行階段二的來的JAVA二進制碼,
輸出的結果桥胞,也就是在客戶端見到的恳守,這時隱藏在階段一和階段二的參數(shù)contentType就發(fā)揮了功效
4. 和contentType效果一樣的設置方式還有 html頁面charset, response.setCharacterEncoding(),
response.setContentType(),response.setHeader(); response.setContentType(),
response.setHeader();優(yōu)先級最好,其次是response.setCharacterEncoding();再者是
<%@page contentType="text/html; chareset=gbk"%>,最后是
content="text/html; charset=gb2312" />.
5. web頁面輸入編碼: 在設置頁面編碼<%@page contentType="text/html; chareset=gbk"%>的同時,也就指定了頁面的輸入編碼;如果頁面的顯示被設置為UTF-8贩虾,那么用戶所有的頁面輸入都會按照 UTF-8 編碼; 服務器端程序在讀 取表單輸入之前要設定輸入編碼; 表單被提交后催烘,瀏覽器會將表單字段值轉(zhuǎn)換為指定字符集對應的字節(jié)值,然后根據(jù) HTTP 標準 URL編碼方案對結果字節(jié)進行編碼.但是頁面需要告訴服務器當前頁面的編碼方式;request.setCharacterEncoding(),能修改Serverlet獲取請求的編碼,response.setCharacterEncoding(),能修改Serverlet返回結果的編碼.