小方的Java博客

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            27 隨筆 :: 17 文章 :: 115 評論 :: 0 Trackbacks
          在一個Web應用中經常需要向服務器傳遞一些參數,一般通過form向服務器發送一個POST請求。在參數中有可能包含中文信息,如用戶信息登記、購物定單中的地址信息等等。參數字符串一般用本地字符集進行編碼,如中文采用GB2312或GBK字符集,英文或西歐文字采用ISO8859_1字符集,但在Java程序中一律采用Unicode處理字符串,這就需要有一個編碼轉換的過程。不幸的是,現有的大部分Java應用服務器都是在英語國家開發出來的,由于缺乏大字符集(中文、日文、韓文等)的應用環境,這些應用服務器在處理HTTP請求參數時都存在一些中文處理的問題,也是最為困擾JSP和Servlet開發者的問題。 

          產生這一問題的根本原因是在HTTP請求中缺乏足夠的信息來指明客戶端所使用的字符集。在一個JSP頁面中我們可以通過下面的偽指令來指明輸出頁面所使用的字符集: 



          JSP引擎會將上面的偽指令轉換為HTTP應答的頭部: 

          Content-Type: text/html; charset=GB2312 

          樣輸出的就是采用GB2312編碼的中文頁面,瀏覽器會正確地顯示出中文。但瀏覽器在將form的內容POST到服務器時卻沒有包含charset,而且將中文內容用%xx的形式(xx是十六進制數)進行編碼,例如漢字"中"的GB2312內碼為0xD6D0,在HTTP請求中就變成了%D6%D0,根據RFC2616的規定,如果在HTTP請求中未指明字符集,就使用ISO8859_1編碼,這樣"中"字在處理時變成了兩個字符,分別為'u00D6'和'u00D0',而返回到客戶端時變成了兩個不可顯示的字符,瀏覽器一般顯示成'??'。 

          解決這一問題的傳統做法是編寫額外的代碼來完成字符集的轉換: 

          strOut = new String(strIn.getBytes("8859_1"), "GB2312"); 

          strIn是未經過轉換的字符串,其編碼為ISO8859_1,strOut是經過轉換的字符串,其編碼為GB2312。 

          在Apusic 0.9.5版中實現了Java Servlets 2.3規范草案,其中在ServletRequest接口中新增了一個方法setCharacterEncoding(String enc),可以補上在HTTP請求中缺少的charset信息,而上面這一煩瑣的轉換過程就在Servlet引擎中自動完成了,而且Servlet引擎還對轉換過程做了優化,提高了運行效率。下面給出一個簡單的例子,大家可以做一下比較。 

          // 傳統方式 
          <%@ page contentType="text/html; charset=gb2312" %> 
          <html> 
          <body> 
          <form method=post action=test.jsp> 
          <input type=text name=your_name> 
          </form> 
          <%= new String(request.getParameter("your_name").getBytes("8859_1"), "GB2312"%> 
          </body> 
          </html> 

          // 新的方式 
          <%@ page contentType="text/html; charset=gb2312" %> 
          <% request.setCharacterEncoding("GB2312"); %> 
          <html> 
          <body> 
          <form method=post action=test.jsp> 
          <input type=text name=your_name> 
          </form> 
          <%= request.getParameter("your_name"%> 
          </body> 
          </html> 
          posted on 2006-02-01 12:46 方佳瑋 閱讀(303) 評論(0)  編輯  收藏 所屬分類: Jsp

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


          網站導航:
           
          主站蜘蛛池模板: 白城市| 喀什市| 台江县| 克什克腾旗| 泾川县| 晋中市| 崇左市| 平邑县| 苏尼特右旗| 江北区| 沈阳市| 蕉岭县| 临颍县| 绥滨县| 清涧县| 芜湖市| 澎湖县| 交城县| 西平县| 南宁市| 宁夏| 广南县| 尚志市| 牙克石市| 雅江县| 永胜县| 丁青县| 安仁县| 卓尼县| 叙永县| 兴义市| 巴东县| 乐业县| 含山县| 长海县| 三台县| 肥城市| 略阳县| 保康县| 亚东县| 扬中市|