說明:本文為作者原創,作者聯絡地址為:josserchai@yahoo.com。由於Java編程中的中文問題是一個老生常談的問題,在閱讀了許多關於Java中文問題解決方案之後,結合作者的編程實踐,我發現過去談的許多方法都不能清晰地說明問題及解決問題,尤其是跨平台時的中文問題。於是我給出此篇文章,內容包括對控制台啟動並執行class、Servelets、JSP及EJB類中的中文問題我剖析和建議解決辦法。希望大家指教。 Abstract:本文深入分析了Java程式設計中Java編譯器對java源檔案和JVM對class類檔案的編碼/解碼過程,通過此過程的解析透視出了Java編程中中文問題產生的根本原因,最後給出了建議的最佳化的解決Java中文問題的方法。 1、中文問題的來源 電腦最初的作業系統支援的編碼是單位元組的字元編碼,於是,在電腦中一切處理常式最初都是以單位元組編碼的英文為準進行處理。隨著電腦的發展,為了適應世界其它民族的語言(當然包括我們的漢字),人們提出了UNICODE編碼,它採用雙位元組編碼,相容英文字元和其它民族的雙位元組字元編碼,所以,目前,大多數國際性的軟體內部均採用UNICODE編碼,在軟體運行時,它獲得本地支援系統(多數時間是作業系統)預設支援的編碼格式,然後再將軟體內部的UNICODE轉化為本地系統預設支援的格式顯示出來。Java的JDK和JVM即是如此,我這裡說的JDK是指國際版的JDK,我們大多數程式員使用的是國際化的JDK版本,以下所有的JDK均指國際化的JDK版本。我們的漢字是雙位元組編碼語言,為了能讓電腦處理中文,我們自己制定的gb2312、GBK、GBK2K等標準以適應電腦處理的需求。所以,大部分的作業系統為了適應我們處理中文的需求,均定製有中文作業系統,它們採用的是GBK,GB2312編碼格式以正確顯示我們的漢字。如:中文Win2K預設採用的是GBK編碼顯示,在中文WIN2k中儲存檔案時預設採用的儲存檔案的編碼格式也是GBK的,即,所有在中文WIN2K中儲存的檔案它的內部編碼預設均採用GBK編碼,注意:GBK是在GB2312基礎上擴充來的。 由於Java語言內部採用UNICODE編碼,所以在JAVA程式運行時,就存在著一個從UNICODE編碼和對應的作業系統及瀏覽器支援的編碼格式轉換輸入、輸出的問題,這個轉換過程有著一系列的步驟,如果其中任何一步出錯,則顯示出來的漢字就會出是亂碼,這就是我們常見的JAVA中文問題。 同時,Java是一個跨平台的程式設計語言,也即我們編寫的程式不僅能在中文windows上運行,也能在中文Linux等系統上運行,同時也要求能在英文等系統上運行(我們經常看到有人把在中文win2k上編寫的JAVA程式,移植到英文Linux上運行)。這種移植操作也會帶來中文問題。 還有,有人使用英文的作業系統和英文的IE等瀏覽器,來運行帶中文字元的程式和瀏覽中文網頁,它們本身就不支援中文,也會帶來中文問題。 幾乎所有的瀏覽器預設在傳遞參數時都是以UTF-8編碼格式來傳遞,而不是按中文編碼傳遞,所以,傳遞中文參數時也會有問題,從而帶來亂碼現象。 總之,以上幾個方面是JAVA中的中文問題的主要來源,我們把以上原因造成的程式不能正確運行而產生的問題稱作:JAVA中文問題。 2、JAVA編碼轉換的詳細過程 我們常見的JAVA程式包括以下類別: *直接在console上啟動並執行類(包括可視化介面的類) *JSP代碼類(註:JSP是Servlets類的變型) *Servelets類 *EJB類 *其它不可以直接啟動並執行支援類 這些類檔案中,都有可能含有中文字串,並且我們常用前三類JAVA程式和使用者直接互動,用於輸出和輸入字元,如:我們在JSP和Servlet中得到用戶端送來的字元,這些字元也包括中文字元。無論這些JAVA類的作用如何,這些JAVA程式的生命週期都是這樣的: *編程人員在一定的作業系統上選擇一個合適的編輯軟體來實現來源程式代碼並以.java副檔名儲存在作業系統中,例如我們在中文win2k中用記事本編輯一個java來源程式; *編程人員用JDK中的javac.exe來編譯這些原始碼,形成.class類(JSP檔案是由容器調用JDK來編譯的); *直接運行這些類或將這些類布署到WEB容器中去運行,並輸出結果。 那麼,在這些過程中,JDK和JVM是如何將這些檔案如何編碼和解碼並啟動並執行呢? |