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~
