隨筆 - 42  文章 - 71  trackbacks - 0
          <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          之前其實遇到過fmt:formatDate標簽導致頁面中文亂碼的問題,但是當時是我同事修改了程序解決的,我沒有自己研究。昨天需要用到fmt標簽了,想起來這個問題,嘗試重現(xiàn)了一下,在Resin上是正常的,在WebSphere上是亂碼的,于是就研究研究吧。

          由于歷史原因,我們現(xiàn)在使用的軟件產(chǎn)品、開源框架都比較舊,列在下面:

          J2EE Web: 2.3

          JSTL: 1.0.6, 需要JSP 1.2 的Web容器支持

          生產(chǎn)環(huán)境:JDk 1.4.2, WebSphere: 5.1.1.19,支持Servlet 2.3, JSP 1.2, EJB 2.0

          開發(fā)環(huán)境:JDK 1.5.0(javac時編譯為1.4版本), Resin: 3.2.1

          文件編碼及頁面ContentType中的編碼:UTF-8

           

          首先,使用Fiddler跟蹤一下,發(fā)現(xiàn)頁面響應的編碼不再是我在頁面設置的UTF-8了,而是變成了GB13080。根據(jù)JSTL的說明文檔,很多fmt標簽都會調(diào)用fmt:setLocale,比如fmt:formatDate, fmt:formatNumber等。而fmt:setLocale會通過調(diào)用ServletResponse.setLocale方法來設置響應的Locale。在Servlet 2.3規(guī)范中,設置響應的Locale會影響頁面的編碼,同時規(guī)范中也說到,如果調(diào)用ServletResponse.setContentType,并且在參數(shù)中指明charset,那么會使用charset去覆蓋由于ServletResponse.setLocale導致的編碼。

           

          問題的原因比較清楚了,解決辦法有這么幾種

          1. 在調(diào)用了fmt標簽之后,通過response.setContentType("text/html; charset=UTF-8");來重設頁面編碼。但是這是不現(xiàn)實的,也是很傻的

          2. 使用Filter設置Response的編碼。比如org.springframework.web.filter.CharacterEncodingFilter。Sorry,Servlet 2.3規(guī)范中,僅有g(shù)etCharacterEncoding(),沒有setCharacterEncoding。所以在org.springframework.web.filter.CharacterEncodingFilter的代碼中,有一個靜態(tài)變量,就是用來檢測Web容器是否提供setCharacterEncoding編碼的:

          private final static boolean responseSetCharacterEncodingAvailable = ClassUtils.hasMethod(
                      HttpServletResponse.class, "setCharacterEncoding", new Class[] {String.class});

           

          3. 設置Locale和編碼的對照。還是不行,因為從Servlet 2.4 才開始提供Locale和編碼的映射關系,在web.xml里面:

          <locale-encoding-mapping-list>
              <locale-encoding-mapping>
                  <locale>ja</locale>
                  <encoding>Shift_JIS</encoding>
              </locale-encoding-mapping>
          </locale-encoding-mapping-list>

           

          方法1太傻,即使它能解決這個問題,也不能真的用這種方法;方法2和方法3在我們現(xiàn)在環(huán)境中不支持。

          所以,最后,放棄了fmt,使用Struts的bean:write。

          JSTL,挺好的東西,俺只有望洋興嘆的份了~~~

          Technorati 標簽: ,,,,
          posted on 2009-07-22 22:27 YODA 閱讀(4114) 評論(3)  編輯  收藏

          FeedBack:
          # re: JSTL fmt 標簽導致中文亂碼的問題 2009-07-24 13:04 施華洛世奇
          好好取理  回復  更多評論
            
          # re: JSTL fmt 標簽導致中文亂碼的問題 2009-09-27 17:17 catchersun
          YODA大師真是很厲害,初次訪問你的blog很有收獲  回復  更多評論
            
          # re: JSTL fmt 標簽導致中文亂碼的問題 2009-10-21 21:16 BeanSoft
          從 WebLogicFans 鏈過來的 參觀一下 WebLogic 高手的 Blog  回復  更多評論
            

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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 平原县| 永嘉县| 合水县| 罗甸县| 兴安县| 台州市| 西畴县| 霍州市| 荔波县| 新沂市| 醴陵市| 临高县| 华宁县| 新源县| 冕宁县| 南江县| 濮阳市| 丰镇市| 车致| 新营市| 台中市| 浦北县| 句容市| 繁峙县| 南宁市| 余江县| 武威市| 大石桥市| 抚远县| 泸水县| 稷山县| 阳春市| 肥乡县| 鸡西市| 南川市| 普宁市| 合山市| 天等县| 桂东县| 赤壁市| 台前县|