JSP很贊,這點地球人都知道。對於小型項目,可以像PHP、ASP一樣作爲純腳本語言使用,極大的提高開發效率;大中型的項目,有Servlet做爲filter、controller,組件有JavaBean和EJB,再結合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間交互的處理
好了,現在可以著手解決問題了。要正確的顯示某種字符集,那就得對各各環節統一編碼。對於中文,我們可以使用國內的
GB2312,
GBK(非標准)、
GB18030這幾種編碼,繁體?別擔心,
GBK和
GB18030可以兼容
BIG5。但是,
GB2312太小,
GBK是
GB2312的擴展而不是標准編碼,
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間交互的處理
做完上面的兩步,你的JSP和Servlet就可以使用UTF-8編碼集進行正確的中文處理了,但還僅限於獨立、沒有交互的單個JSP和Servlet。系統需要交互,所以最後我們要解決的就是頁面間的交互問題。
JSP之間的交互是由Container來完成的,而Tomcat和Resin默認使用的都是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