指定統(tǒng)一字符集時,到底是指定ISO8859_1 、GBK還是UTF-8呢?
(1)如統(tǒng)一指定為ISO8859_1,因為目前大多數(shù)軟件都是西方人編制的,他們默認的字符集就是ISO8859_1,包括操作系統(tǒng)Linux和數(shù)據(jù)庫MySQL等。這樣,如果指定Jive統(tǒng)一編碼為ISO8859_1,那么就有下面3個環(huán)節(jié)必須把握:
開發(fā)和編譯代碼時指定字符集為ISO8859_1。
運行操作系統(tǒng)的默認編碼必須是ISO8859_1,如Linux。
在JSP頭部聲明:。
(2)如果統(tǒng)一指定為GBK中文字符集,上述3個環(huán)節(jié)同樣需要做到,不同的是只能運行在默認編碼為GBK的操作系統(tǒng),如中文Windows。
統(tǒng)一編碼為ISO8859_1和GBK雖然帶來編制代碼的方便,但是各自只能在相應的操作系統(tǒng)上運行。但是也破壞了Java跨平臺運行的優(yōu)越性,只在一定范圍內(nèi)行得通。例如,為了使得GBK編碼在linux上運行,設(shè)置Linux編碼為GBK。
那么有沒有一種除了應用系統(tǒng)以外不需要進行任何附加設(shè)置的中文編碼根本解決方案呢?
將Java/J2EE系統(tǒng)的統(tǒng)一編碼定義為UTF-8。UTF-8編碼是一種兼容所有語言的編碼方式,惟一比較麻煩的就是要找到應用系統(tǒng)的所有出入口,然后使用UTF-8去“結(jié)扎”它。
一個J2EE應用系統(tǒng)需要做下列幾步工作:
開發(fā)和編譯代碼時指定字符集為UTF-8。JBuilder和Eclipse都可以在項目屬性中設(shè)置。使用過濾器,如果所有請求都經(jīng)過一個Servlet控制分配器,那么使用Servlet的filter執(zhí)行語句,將所有來自瀏覽器的請求(request)轉(zhuǎn)換為UTF-8,因為瀏覽器發(fā)過來的請求包根據(jù)瀏覽器所在的操作系統(tǒng)編碼,可能是各種形式編碼。關(guān)鍵一句:
request.setCharacterEncoding("UTF-8")。
網(wǎng)上有此filter的源碼,Jdon框架源碼中 com.jdon.util.SetCharacterEncodingFilter
需要配置web.xml 激活該Filter。
在JSP頭部聲明:。
在Jsp的html代碼中,聲明UTF-8:
設(shè)定數(shù)據(jù)庫連接方式是UTF-8。例如連接MYSQL時配置URL如下:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
注意,上述寫法是JBoss的mysql-ds.xml寫法,多虧網(wǎng)友提示,在tomcat中&要寫成&即可。一般其他數(shù)據(jù)庫都可以通過管理設(shè)置設(shè)定UTF-8
其他和外界交互時能夠設(shè)定編碼時就設(shè)定UTF-8,例如讀取文件,操作XML等。
筆者以前在Jsp/Servlet時就采取這個原則,后來使用Struts、Tapestry、EJB、Hibernate、Jdon等框架時,從未被亂碼困擾過,可以說適合各種架構(gòu)。希望本方案供更多初學者分享,減少Java/J2EE的第一個攔路虎,也避免因為采取一些臨時解決方案,導致中文問題一直出現(xiàn)在新的技術(shù)架構(gòu)中。
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |