<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 64,  comments - 9,  trackbacks - 0

    Motivition

    曾經有一個網友問過我這樣一個問題:
    <%@page contentType="text/html; charset=UTF-8"%>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
    中國
    </body>
    </html>
    這個頁面在為什么在運行的時候“中國”會變成亂碼?

    Analysis

          Key Step

    對于上面問題的分析需要從整個JSP頁面請求的生命周期來看,一般的都需要經歷下面幾個階段:
    1。應用服務器根據JSP頁面生成一個Java文件
    2。應用服務器調用java.exe將Java文件編譯成一個Servlet對應的class文件
    3。用戶的瀏覽器請求JSP對應的Servlet,Web容器起一個線程執行Servlet,將數據返回給客戶端瀏覽器
    4。用戶的IE根據返回的數據,將結果顯示給用戶。

          Key Step Analysis

    為了更好的了解編碼問題,我們暫時先從上面的四個環節一步步來分析,根據分析的結果,來得到最終的解決辦法。

    1. 在應用服務器根據JSP頁面生成Java文件階段。

    應用服務器會將整個JSP頁面的代碼讀取出來,然后寫到一個新的JAVA文件中,在讀文件和寫文件的時候都牽涉到一個編碼問題,這個編碼問題應用服務器是如何解決的呢?我研究Tomcat應用服務器的源代碼,發現Tomcat中有一個pageEncoding參數非常重要,在ParserController會從JSP文件中讀出這個參數(如果沒有讀到,就從第一行的contentType中讀取charset),然后保存起來,如果沒有讀取到這個參數,會從JspConfig中讀出一個默認的PageEncoding參數,如果這兩個參數都沒有的設置,系統會默認成ISO8859-1的編碼來讀取原來的JSP文件。
       從上面的分析出,我們已經基本了解了應用服務器讀取JSP文件的編碼方式,由于Java底層都是基于Unicode編碼來存儲字符的,所以在寫文件的時候,都輸出成Unicode編碼的形式。
    2。在JDK將Java文件編譯成Class文件的時候
    可以利用-encoding參數指定源文件的編碼,這在手動編譯的時候非常重要,因為這決定了Java虛擬機讀取Java文件時采用的編碼方式,但是在Web應用中這個環節我們可以忽略,因為應用服務器可以很好的解決這個編碼。以Tomcat為例,由于生成的java文件是固定的UTF-8編碼,所以Tomcat也固定的采用UTF-8編碼來讀取,通過瀏覽AbstractCatalinaTask可以看到reader = new InputStreamReader(hconn.getInputStream(), CHARSET);其中的CHARSET=utf-8。所以在這個環節中應用服務器都可以很好的把握,不會帶來編碼問題。

    3. 用戶的瀏覽器請求JSP對應的Servlet階段。

    如果前面的環節中不會帶來編碼問題,也就是說在Java虛擬機中運行的時候,能正常的獲取到“中國”,那么在執行servlet的環節中不會“中國”始終是以Unicode存儲的中國,那么在第三個環節中需要關注的是JspWriter如何將數據返回給客戶端瀏覽器。大家可以試驗一下,在java中如果用new String(str.getBytes("encoding"),"encoding")執行的時候,始終不會出現亂碼問題,也就是說,一個字符串可以用不同的代碼來getBytes()生成字節數組(底層I18N.jar所作的工作,提供Byte2Char和Char2Byte的轉換)。
       如果大家可以理解這一點,那么下面大家就需要了解JspWriter輸出字符串時采用的編碼方式是什么?通過瀏覽Response.java類可以了解到Tomcat應用服務器是根據contentType來獲取的writer的編碼方式,也就是說,最后返回客戶端的字節流是contentType對應的charset中獲取出來的字節數組。

    4. IE根據返回的數據處理顯示階段

    通過前面的分析可以了解到,應用服務器返回的“中國”是根據ContentType中的charset來顯示的,只要IE知道該用這個編碼來接收字節流并轉成字符串,并將用戶的瀏覽器推薦合適的編碼來查看結果,用戶就可以瀏覽到正確的“中國”兩個字。可以高興得是,目前的IE等瀏覽器正式這樣處理的。

    Conclusion

    通過上面的分析,我們可以看到,在整個JSP頁面的編碼過程中,我們真正要解決的是JSP文件到Java文件這個過程中的編碼問題,也就是PageEncoding參數的設置問題。由于pageEncoding參數是servlet2.3規范中規定的參數,所以下面的方法在很多應用服務器下面都通用,這方面的設置本人在工作中基本上得到了下面的一些方法:
    1。在JSP頁面的中加上pageEncoding參數,比如:<%@ page contentType="text/html; charset=UTF-8" pageEncoding="GBK"%>,這樣就可以將頁面可以用ANSI來存儲。也就是說當頁面存儲的編碼方式和chtentType中的charset不一樣的時候,可以考慮加上pageEncoding參數。
    2。有些應用服務器(如weblogic),在沒有獲取到pageEncoding參數的時候,不是先從charset中獲取編碼類型,而是從另外的一些配置文件,如weblogic.xml文件中加上下面的代碼:
    <jsp-descriptor>
         <jsp-param>
              <param-name>compilerSupports</param-name>
              <param-value>true</param-value>
         </jsp-param>
         <jsp-param>
              <param-name>encoding</param-name>
              <param-value>GBK</param-value>
         </jsp-param>
    </jsp-descriptor>
    (在Tomcat5X種也有類似的處理,在應用的web.xml文件中加上類似下面的配置項)
    </jsp-config>
    <jsp-property-group>
               <url-pattern>*.jsp</url-pattern>
               <el-ignored>true</el-ignored>
    </jsp-property-group>
    </jsp-config>

     

    以上是對JSP頁面編碼的一些分析和處理方法,希望能對大家今后的學習和工作中有幫助!

    posted on 2009-07-23 14:41 super_nini 閱讀(341) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2009年7月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    常用鏈接

    留言簿

    隨筆檔案

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产精品国产免费无码专区不卡| 一个人看www免费高清字幕| 久久精品免费观看国产| 亚洲欧美日韩中文高清www777| 亚洲暴爽av人人爽日日碰| 国产在线观看免费视频软件| 亚洲无码精品浪潮| 又硬又粗又长又爽免费看| 国产精品V亚洲精品V日韩精品| 人人爽人人爽人人片av免费 | 99久久亚洲综合精品成人网| 亚洲偷偷自拍高清| 99精品全国免费观看视频| 亚洲精品免费网站| 日日操夜夜操免费视频 | 黄色大片免费网站| 台湾一级毛片永久免费| 亚洲欧美自偷自拍另类视| 亚洲狠狠色丁香婷婷综合| 国产色爽免费视频| 美女视频黄a视频全免费网站色 | 在线观看免费av网站| 亚洲精品国产专区91在线| 毛片网站免费在线观看| 国产精品亚洲AV三区| 久久久久亚洲av成人无码电影| 中文字幕在线视频免费| 久久丫精品国产亚洲av| 又粗又大又黑又长的免费视频| 亚洲AV无码一区二区三区网址 | 亚洲AV无码片一区二区三区| 亚洲视频在线精品| 免费人成在线观看网站品爱网 | 亚洲视频在线一区二区| 欧洲精品99毛片免费高清观看| 亚洲AV成人一区二区三区在线看 | 黄视频在线观看免费| 最新猫咪www免费人成| 免费的黄网站男人的天堂| 亚洲人成在线播放网站岛国| 国产免费福利体检区久久|