<%@ page contentType="text/html" pageEncoding="GBK" %> 每一個JSP頁面中的首行都是以上的內(nèi)容,其實這一行代碼的contentType中還隱藏了一個charset=“編碼類型”; 我們知道,JSP本質(zhì)上就是一個Servlet(JSP可以完成的功能Servlet全都可以完成,反之不行),而Servlet就是一個JAVA類,所以一個JSP頁面編寫完成之后執(zhí)行的時候,Tomcat就會自動將其翻譯成*.java,然后再由*.java編譯成*.class文件,然后當用戶訪問JSP頁面的時候由Tomcat或其他容器來執(zhí)行*.class文件。 pageEncoding是JSP文件本身的編碼,而contentType中的charset是服務(wù)器發(fā)送給客戶端時的內(nèi)容編碼。 下面來做一個小測驗就知道這兩者的差別了,首先我們新建一個簡單的jsp頁面,可以看到里面只是簡單的輸出了一句話“測試pageEncoding和contentType中的charSet的區(qū)別!”,其中包含中文和英文字符,pageEncoding編碼方式設(shè)為“GBK”:
這樣我們再刷新頁面會出現(xiàn)中文亂碼 但是這種亂碼卻可以通過改變?yōu)g覽器的編碼方式來解決,在瀏覽器空白處右鍵-->編碼,選擇Unicode(UTF-8)即可。 那我們現(xiàn)在再來改一下,我們將pageEncoding改為utf-8;即: <%@ page contentType="text/html" pageEncoding="utf-8"%> 這樣很明顯,JSP在編碼的時候?qū)⒉捎胾tf-8;默認的charset也是utf-8 ,這個時候刷新,頁面中又出現(xiàn)了亂碼。 在此基礎(chǔ)上,我們改變charset=gbk再來看一下效果,此時瀏覽器的編碼為utf-8: 修改瀏覽器編碼為GBK: 可以看到,當pageEncoding編碼為UTF-8時無論如何,用戶訪問JSP頁面的時候,內(nèi)容都是中文亂碼。
為什么會這樣,pageEncoding和contentType中的charset區(qū)別到底在哪里? 網(wǎng)上搜索了一下,我認為下面的這個解釋說的挺好,挺詳細的。 事實上,jsp需要經(jīng)過兩次“編碼”,第一階段會用pageEncoding,第二階段會用utf-8的.java文件至utf-8的.class文件,第三階段就是由Tomcat傳回瀏覽器的網(wǎng)頁, 用的是contentType。ContentType 屬性指定響應(yīng)的 HTTP 內(nèi)容類型。如果未指定 ContentType,默認為 text/HTML。 第一階段:將jsp編譯成Servlet(.java)文件。用到的指令是pageEncoding,根據(jù)pageEncoding=“XXX”的指示,找到編碼的規(guī)則為“XXX”,服務(wù)器在將JSP文件編譯成.java文件時會根據(jù)pageEncoding的設(shè)定讀取jsp,結(jié)果是由指定的編碼方案翻譯成統(tǒng)一的UTF-8編碼的JAVA源碼(即.java)。
pageEncoding:設(shè)置JSP源文件本身和響應(yīng)正文中的字符集編碼。 contentType:設(shè)置JSP源文件和響應(yīng)正文的字符集編碼及MIME類型。 contentType的charset:設(shè)置服務(wù)器發(fā)送給客戶端時的內(nèi)容的編碼。
可以簡單認為是,pageEncoding是jsp文件本身的編碼;contentType的charset是指服務(wù)器發(fā)送給客戶端時的內(nèi)容編碼。例如:pageEncoding="GBK"。這句話的意思是,告訴JVM 這個jsp本身采用的"GBK"編碼,在JSP編譯成Servlet傳給JVM的時候,就用“GBK”的編碼方式將Jsp網(wǎng)頁源文件翻譯成統(tǒng)一的UTF-8形式的Java字節(jié)碼(如果不加設(shè)定,則JVM默認的用ISO-8859-1這種編碼方式)。contentType里的charset=gbk,指的是此網(wǎng)頁文件輸出到瀏覽器的輸出方式為gbk(如果不加設(shè)定,則默認為pageEncoding所設(shè)定的編碼類型),理解了以上的過程,相信大家都對上述的各種亂碼情況都有了更深入的理解,知其然而知其所以然了。 (參考文章:http://www.cnblogs.com/kevin-yuan/archive/2011/12/31/2308479.html) |
|