對于Java中文問題的幾條區分原則
發表時間:2024-05-20 來源:明輝站整理相關軟件相關文章人氣:
[摘要]盡管關于Java中文問題的討論已經相當多了,但由于Java的相關技術標準繁多,面向Java的Web服務器、應用服務器以及JDBC數據庫驅動等都沒有官方的標準,所以Java應用在處理中文時所存在的問題不僅沒有消失而且隨著所選用的服務器、驅動程序以及運行環境等因素的不同而變化。那么我們如何從眾多現象中...
盡管關于Java中文問題的討論已經相當多了,但由于Java的相關技術標準繁多,面向Java的Web服務器、應用服務器以及JDBC數據庫驅動等都沒有官方的標準,所以Java應用在處理中文時所存在的問題不僅沒有消失而且隨著所選用的服務器、驅動程序以及運行環境等因素的不同而變化。那么我們如何從眾多現象中找出問題所在,并進行分析和解決呢?與大部分的討論不同,本文將主要從如何預測、發現和檢查問題的角度給出建議,幫助開發人員找出可能引起問題的各種源頭,從而更好地解決Java的中文問題。
引言 盡管對于Java中文處理問題的討論已不乏其數,但由于Java技術涉及內容廣(J2EE包含了十幾種相關技術),技術供應商繁多,面向Java的Web服務器、應用服務器以及JDBC數據庫驅動等都沒有官方的標準,所以Java應用在處理中文過程中出了存在固有的問題外也存在隨著選用的服務器,驅動程序的不同而帶來的Java中文問題的多變性,增加了問題的復雜度。那么,我們如何在這么紛繁的現象中找到問題的癥結呢?
Java中文問題的一般解決辦法 事實上,Java的中文問題都是由于Java應用所采用的缺省編碼格式與目標或者應用所要讀入字符的編碼格式不同而造成的(具體參見文獻1)。對于如何解決Java的中文問題,通常有四種方法:
1)選擇JDK的中文本地化版本。盡管Java2 JDK的中文本地化版本(http://java.sun.com/products/jdk/1.2/chinesejdk.html)并不是一個官方的版本,Sun公司也沒有承諾會對該本地化版本進行升級,但其仍不失為一個Java中文問題的解決方案。
2)選擇合適的編譯參數。對于Java的國際版本來講,我們也可以在編譯Java應用的時候通過指定確定的編碼機制來實現其編譯結果對中文的支持。例如,對于需要支持繁體中文和簡體中文應用可以通過javac -encoding big5 sourcefile.java 和javac -encoding gb2312 sourcefile.java來編譯源程序。
3)通過編程的方式實現字符編碼的轉換代碼。通過編程的方式來解決Java的中文問題,已經成為了一種較為普遍的做法。下面就是一種最常見的字符編碼轉換函數,其將字符的編碼格式轉換為中文Windows系統的GBK編碼形式。
public static String toChinese(String strvalue)
{
try{
if(strvalue==null)
return null;
else
{
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
return strvalue;
}
}catch(Exception e){
return null;
}
}
4)定義字符輸出集。對于JSP應用,我們可以通過<%@ page contentType="text/html; charset=GBK" %>或<%@ page contentType="text/html; charset=GB2312" %>來定義JSP頁面的字符輸出集。當然,我們也可以通過HTML的標記來定義字符的輸出集。
存在的問題
根據方法實現的方式,我們可以將以上四種方法分為兩類,一類是通過利用某些標準或者規則來實現的方法,上面的1)、2)、4)都屬于此類;一類是通過針對性的編程來實現的方法,上面所提的方法3)就屬于此類。
由于方法1),2),4)是具有規范性的一類方法,所以方法比較簡單,解決方案也不具備較大的針對性,較為通用,例如我們可以采用方法2)的編譯方式通過編譯Java源文件來實現內碼的預置,而無需考慮源碼到底有哪些部分出現了Java的中文處理問題,諸如輸出亂碼等等。
但是,正由于這些方法不具備針對性,解決問題的方法過于統一,所以在某些情況下,它們并不能徹底地解決Java的中文問題。舉一個非常常見的例子。在通常情況下,用戶的Java應用往往需要與其它Java應用接口進行交互,例如通過某種版本的JDBC訪問數據庫。由于JDBC的驅動所支持的編碼隨著提供商乃至版本的不同而不同,所以如果在數據庫的輸入輸出過程中出現中文不能正確處理問題時,我們需要在數據的輸入和輸出過程做兩次正好相反的編碼轉換,這對于方法1),2),4)來說,往往是無法解決的。當然,對于方法2,我們也可以通過采用一些技巧使來滿足上面的情況,一個最有效的辦法就是盡量將Java應用的各個部分組件化。例如我們可以通過將數據庫的讀入和輸出代碼分解在不同的源文件上來實現分別編譯,從而滿足不同的字符編碼要求。但是通常的程序設計都不太可能滿足這種要求,因為這種程序的劃分結果很可能是不合理的。例如,我們將數據庫的讀出和寫入方法封裝到一個類中是比較合適的一種設計,但如果將該類的這兩個方法分別實現在兩個文件里則變得非常不合理。因此對于1),2),4)方法來說,雖然實現比較簡單,但卻具有一些無法克服的缺點。這也是那些實現起來相對復雜的編程方法得以流行的原因。
相對于方法1),2),4)來說,方法3)具有更好的針對性和靈活性。程序可以根據不同的情況做出靈活的處理,在任何需要的地方進行字符的編碼轉換,但是該方法的特點也對軟件的開發人員提出了更高要求--必須能夠準確的捕捉到有可能發生中文處理問題的地方,并做出正確的判斷和處理。