Jim’s blog

May 27, 2005

JSP中文問題的解決方案

【11:28 pm By Jim】

JSP很贊,這點地球人都知道。對於小型項目,可以像PHPASP一樣作爲純腳本語言使用,極大的提高開發效率;大中型的項目,有Servlet做爲filter、controller,組件有JavaBeanEJB,再結合XML,成爲了靈活而強大的J2EE,再加上它的平台無關性,Wooooo….這個世界清靜了。

好了,YY完畢,該批鬥它了,靈活和強大的另一面,也正意味著它的門檻高,很難學(當然如果你只用JSP,就當我沒說過好了,不過我想你不會那麽笨吧…);另一方面就是localize的問題,發明Java的是使用26個字母的人,不是使用雙字節中文的我們,所以本地化問題也就順理成章的成爲了我們使用JSP的其中一個障礙。

要解決JSP的中文問題,首先就要先了解JSP。我們知道JSP需要Container來裝載運行,Container的其中一項重要功能就是把JSP轉換成Servlet然後編譯成class執行,也就是說JSP本質上就是Servlet,一個純正的B/S(Browser/Server)架構,所以要解決它的中文問題,就得從Browser和Server這兩個方面入手,然後Browser和Server要通信對不?那就是要傳遞了?Yeah,所以這個中間環節也不要忽略,現在先來總結一下我們需要面對的問題:

  • Client端對中文的處理:Browser
  • Server端對中文的處理:Server
  • Browser/Server間交互的處理

好了,現在可以著手解決問題了。要正確的顯示某種字符集,那就得對各各環節統一編碼。對於中文,我們可以使用國內的GB2312GBK(非標准)、GB18030這幾種編碼,繁體?別擔心,GBKGB18030可以兼容BIG5。但是,GB2312太小,GBKGB2312的擴展而不是標准編碼,GB18030太新,並沒有獲得廣泛的支持,所以現在國內使用最廣泛的還是GB2312。Poor~如果有幸又很不幸,你的系統有法國、德國、俄羅斯、日本、韓國….的用戶使用,那麽情況會更糟糕些,Hey,別擔心,可以解決的,我們有Unicode:)

目前Unicode在Web端使用的最多的是UTF-8,它可以保證系統對多語言的正確處理,下面就來看看怎樣用它來解決煩人的中文問題。

(1)Client端對中文的處理:Browser
把它放在第一位是因爲它最簡單最好解決,不至於把人嚇跑:)
只需要在你的頁面內指定Encoding,告訴Browser使用哪種Encoding顯示就行了,一行代碼可以搞定。

 <%@page contentType=”text/html; charset=UTF-8″%>

上面的代碼加在首行,它告訴Browser,該頁面的內容類型是“text/html”,使用“UTF-8”字符集顯示,用於視圖層,這條代碼是JSP頁面專用的,和靜態頁面中meta的content、charset作用是一樣的。

如果你想保險些,可以連meta也用上,沒有問題。

(2)Server端對中文的處理:Server
Server端的處理也很簡單,只需在頁面的起始位置加上:

 <%@page pageEncoding=”UTF-8″%>

指定Server端使用“UTF-8”編碼集來處理JSP內的Java代碼(其實也就是Servlet)。

(3)Browser/Server間交互的處理
做完上面的兩步,你的JSPServlet就可以使用UTF-8編碼集進行正確的中文處理了,但還僅限於獨立、沒有交互的單個JSPServlet。系統需要交互,所以最後我們要解決的就是頁面間的交互問題。

JSP之間的交互是由Container來完成的,而TomcatResin默認使用的都是ISO8859,所以使用雙字節的字符就會出現煩人亂碼,對了,如果將這個默認的編碼另行指定,就可以解決了。JSP中可以用request.setCharacterEncoding來進行指定。只需要在兩個傳遞的頁面內加入:

 <%request.setCharacterEncoding(”UTF-8″);%>

很簡單吧,一行就OK了。不過….也很笨。譬如說,你有一個現成的系統需要進行這樣的更改,裏面又有一千幾百個頁面,那麽你….

Take is easy!有Jim在,我們可以寫一個Filter來解決這個問題:)我寫了一個:

 /*
  * @author Jim
  * @version 1.0
  * RequestEncodingFilter.java
  * ToDo: To filter the parameter sent by jsp pages, encode them into customize
  * encoding instead of system’s “ISO8859-1″ encoding.
  */

 package cn.jwing.cms.common;

 import java.io.*;
 import javax.servlet.*;
 import javax.servlet.http.*;

 public class RequestEncodingFilter implements Filter {
     String charset = null;

     public void init(FilterConfig config) throws ServletException {
         charset = config.getInitParameter(”charset”);
         if (charset == null) charset = “UTF-8″;
     }

     public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException,ServletException {
         request.setCharacterEncoding(charset);
         chain.doFilter(request, response);
     }
     public void destroy() {
     }
 }

把它扔到classes下,在web.xml中加入相應的servlet、filter項就行了,Simple:)

到此爲止,你的系統已經可以正確的處理中文了(其實應該說什麽文都沒問題了),結束?No!還有最基本的一點要說一下,相信無論是高手還是低手,都很有可能在這點上疏忽了,就是Editor/IDE的默認文件編碼!這也是最根本的一點,可別把系統想得那麽聰明,會幫你自動進行轉碼的工作,計算機可是最笨的。如果你編輯産生的文件,根本就不是UTF-8而是系統默認的GBK或是CP1252之流,那麽上面所做的一切,都是無用功。所以在做上面的三步之前,先確認你的Editor/IDE支持並使用UTF-8

最後總結一下,解決方案的四個要點:

  • Browser端Encoding的指定
  • Server端Encoding的指定
  • 頁面間傳輸的Encoding的指定
  • Editor/IDE Encoding的指定

好了,收工~
Good luck

Comments »

The URI to TrackBack this entry is: http://jim.blogsome.com/2005/05/27/jsp-chinese-character-solution/trackback/

No comments yet.

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>



This work is licensed under a Creative Commons License .
Get free blog up and running in minutes with Blogsome | Theme designs available here