一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JSP中的pagaEncoding和contentType中charset的區(qū)別

 人人驛站 2015-05-10

<%@ 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”:

  1. <%@ page contentType="text/html" pageEncoding="GBK"%>  
  2. <html>  
  3. <head>  
  4. <title>登陸驗證</title>  
  5. </head>  
  6. <body>  
  7. <%="測試pageEncoding和contentType中的charSet的區(qū)別!"%>  
  8.   
  9. </body>  
  10. </html>  
       很顯然,啟動Tomcat程序運行沒有任何問題,可以輸出。

      我們現(xiàn)在修改上面的代碼,在pageContent中加入charset=utf-8 ,即:<%@ page contentType="text/html;charset=utf-8" pageEncoding="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)。


第二階段:從Servlet文件(.java)到Java字節(jié)碼文件(.class),從UTF-8到UTF-8。在這一階段中,不論JSP編寫時候用的是什么編碼方案,經(jīng)過這個階段的結(jié)果全部是UTF-8的encoding的java源碼。JAVAC用UTF-8的encoding讀取java源碼,編譯成UTF-8編碼的二進制碼(即.class),這是JVM對常數(shù)字串在二進制碼(java encoding)內(nèi)表達的規(guī)范。這一過程是由JVM的內(nèi)在規(guī)范決定的,不受外界控制。


第三階段:從服務(wù)器到瀏覽器,這在一過程中用到的指令是contentType。服務(wù)器載入和執(zhí)行由第二階段生成出來JAVA二進制碼,輸出的結(jié)果,也就是在客戶端可見到的結(jié)果,在這次輸出過程中,由contentType屬性中的charset來指定,將UTF8形式的二進制碼以charset的編碼形式來輸出。如果沒有人為設(shè)定,則默認的是ISO-8859-1的形式。


           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


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    好吊日在线视频免费观看| 亚洲专区中文字幕在线| 人妻熟女中文字幕在线| 亚洲成人免费天堂诱惑| 久热人妻中文字幕一区二区| 午夜精品国产精品久久久| 欧美日韩国产一级91| 日韩欧美综合中文字幕| 亚洲综合激情另类专区老铁性| 人妻熟女欲求不满一区二区| 99久久婷婷国产亚洲综合精品| 91在线国内在线中文字幕| 亚洲高清中文字幕一区二区三区| 一区二区不卡免费观看免费| 欧美不卡一区二区在线视频| 在线视频免费看你懂的| 好吊妞在线免费观看视频| 欧洲一区二区三区蜜桃| 四十女人口红哪个色好看| 好东西一起分享老鸭窝| 久热久热精品视频在线观看| 欧美日韩有码一二三区| 东京不热免费观看日本| 蜜桃av人妻精品一区二区三区| 中国一区二区三区人妻| 99久久国产精品免费| 日本美国三级黄色aa| 成人精品国产亚洲av久久| 欧美激情一区=区三区| 欧美一级黄片免费视频| 精品视频一区二区不卡| 欧美日韩综合在线精品| 国产一级性生活录像片| 九九九热视频最新在线| 国产又黄又猛又粗又爽的片| 国产精品欧美激情在线播放| 九九视频通过这里有精品| 人人妻在人人看人人澡| 国产一区二区三区av在线| 欧美人妻少妇精品久久性色| 日本不卡在线视频中文国产|