說明:本文為作者原創,作者聯系地址為:
josserchai@yahoo.com
。由于
Java
編程中的中文
問題是一個老生常談的問題,在閱讀了許多關于
Java
中文問題解決方法之后,結合作者的編程實踐,我發現過去談的許多方法都不能清晰地說明問題及解決問題,尤其是跨平臺時的中文問題。于是我給出此篇文章,內容包括對控制臺運行的
class
、
Servelets
、
JSP
及
EJB
類中的中文問題我剖析和建議解決辦法。希望大家指教。任何引用本文請注明出處!!
Abstra
ct
:本文深入分析了
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
是如何將這些文件如何編碼和解碼并運行的呢?
這里,我們以中文
win2k
操作系統為例說明
JAVA
類是如何來編碼和被解碼的。
?
???
第一步,我們在中文
win2k
中用編輯軟件如記事本編寫一個
Java
源程序文件
(
包括以上五類
JAVA
程序
)
,程序文件在保存時默認采用了操作系統默認支持
GBK
編碼格式
(
操作系統默認支持的格式為
file.encoding
格式
)
形成了一個
.java
文件,也即,
java
程序在被編譯前,我們的
JAVA
源程序文件是采用操作系統默認支持的
file.encoding
編碼格式保存的
,
java
源程序中含有中文信息字符和英文程序代碼;要查看系統的
file.encoding
參數,可以用以下代
碼:
public class ShowSystemDefaultEncoding {
public static void main(String[] args) {
String encoding = System.getProperty("file.encoding");
System.out.println(encoding);
}}
???
第二步,我們用
JDK
的
javac.exe
文件編譯我們的
Java
源程序,由于
JDK
是國際版的,在編譯的時候,如果我們沒有用
-encoding
參數指定我們的
JAVA
源程序的編碼格式,則
javac.
exe
首先獲得我們操作系統默認采用的編碼格式
,也即在編譯
java
程序時,若我們不指定源
程序文件的編碼格式,
JDK
首先獲得操作系統的
file.encoding
參數
(
它保存的就是操作系統
默認的編碼格式,如
WIN2k
,它的值為
GBK)
,然后
JDK
就把我們的
java
源程序從
file.encodi
ng
編碼格式轉化為
JAVA
內部默認的
UNICODE
格式放入內存中。然后,
javac
把轉換后的
unicode
格式的文件進行編譯成
.class
類文件,此時
.class
文件是
UNICODE
編碼的,它暫放在內存中,緊接著,
JDK
將此以
UNICODE
編碼的編譯后的
class
文件保存到我們的
操作系統中形成我們見到的
.class文件。
對我們來說,我們最終獲得的.class文件是內容以UNICODE編碼格式保存的類文件
,它內部包含我們源程序中的中文字符串,只不過此時它己經由
file.encoding
格式轉化為
UNICODE
格式了。
???
這一步中,對于
JSP
源程序文件是不同的,對于
JSP
,這個過程是這樣的:即
WEB
容器調用
JSP
編譯器,
JSP
編譯器先查看
JSP
文件中是否設置有文件編碼格式,如果
JSP
文件中沒有設置
JSP
文件的編碼格式,則
JSP
編譯器調用
JDK
先把
JSP
文件用
JVM
默認的字符編碼格式
(
也即
WEB
容器所在的操作系統的默認的
file.encoding)
轉化為臨時的
Servlet
類,然后再把它編譯成
UNICODE
格式的
class
類,并保存在臨時文件夾中。如:在中文
win2k
上,
WEB
容器就把
JSP
文件從
GBK
編碼格式轉化為
UNICODE
格式,然后編譯成臨時保存的
Servlet
類,以響應用戶的請求。
???
第三步,運行第二步編譯出來的類,分為三種情況:
??? A
、
直接在
console
上運行的類
??? B
、
EJB
類和不可以直接運行的支持類
(
如
JavaBean
類
)
??? C
、
JSP
代碼和
Servlet
類
??? D
、
JAVA
程序和數據庫之間
下面我們分這四種情況來看。
?
??? A
、直接在
console
上運行的類
???
這種情況,運行該類首先需要
JVM
支持,即操作系統中必須安裝有
JRE
。
運行過程是這樣的:首先
java
啟動
JVM
,
此時JVM讀出操作系統中保存的class文件并把內容讀入內存中,此時內存中為
UNICODE格式的
class類
,然后
JVM
運行它,如果此時此類需要接收用戶輸入,則類會默認用file.encoding編碼格式對用戶輸入的串進行編碼并轉化為unicode保存入內存
(用戶可以設置輸入流的編碼格式)。程序運行后,產生的字符串(UNICODE編碼的)再回交給JVM,最后
JRE把此字符串再轉化為
file.encoding格式
(
用戶可以設置輸出流的編碼格式
)
傳遞給操作系統顯示接口并輸出到界面上。
???
對于這種直接在
console
上運行的類,它的轉化過程可用圖
1
更加明確的表示出來:
???
圖
1
以上每一步的轉化都需要正確的編碼格式轉化,才能最終不出現亂碼現象。
?
??? B
、
EJB
類和不可以直接運行的支持類
(
如
JavaBean
類
)
???
由于
EJB
類和不可以直接運行的支持類,它們一般不與用戶直接交互輸入和輸出,它們常常與其它的類進行交互輸入和輸出,所以它們在第二步被編譯后,就形成了內容是
UNICODE
編碼的類保存在操作系統中了,以后只要它與其它的類之間的交互在參數傳遞過程中沒有丟失,則它就會正確的運行。這種
EJB
類和不可以直接運行的支持類
,
它的轉化過程可用圖
2
更加明確的表示出來:
圖
2
?
??? C
、
JSP
代碼和
Servlet
類
???
經過第二步后,
JSP
文件也被轉化為
Servlets
類文件,只不過它不像標準的
Servlets
一
校存在于
classes
目錄中,它存在于
WEB
容器的臨時目錄中,故這一步中我們也把它做為
Servlets
來看。
???
對于
Servlets
,客戶端請求它時,
WEB
容器調用它的
JVM
來運行
Servlet
,首先,
JVM
把
Servlet
的
class
類從系統中讀出并裝入內存中,內存中是以
UNICODE
編碼的
Servlet
類的代碼,然后
JVM
在內存中運行該
Servlet
類,如果
Servlet
在運行的過程中,需要接受從
客戶端傳來的字符如:表單輸入的值和
URL
中傳入的值,
此時如果程序中沒有設定接受參數時采用的編碼格式,則
WEB
容器會默認采用
ISO-8859-1
編碼格式來接受傳入的值并在
JVM
中轉化為
UNICODE
格式的保存在
WEB
容器的內存中
。
Servlet
運行后生成輸出,輸出的字符串是
UNICODE
格式的,緊接著,容器將
Servlet
運行產生的
UNICODE
格式的串(如
html
語法,用戶輸出的串等)直接發送到客戶端瀏覽器上并輸出給用戶,如果此時指定了發送時輸出的編碼格式,則按指定的編碼格式輸出到瀏覽器上,如果沒有指定,則默認按
ISO-8859-1
編碼發送到客戶的瀏覽器上。這種
JSP
代碼和
Servlet
類,它的轉化過程可用
圖
3
更加明確地表示出來:
圖
3
?
??? D
、
Java
程序和數據庫之間
???
對于幾乎所有數據庫的
JDBC
驅動程序,默認的在
JAVA
程序和數據庫之間傳遞數據都是以
ISO-8859-1
為默認編碼格式的,所以,我們的程序在向數據庫內存儲包含中文的數據時,
JDBC
首先是把程序內部的
UNICODE
編碼格式的數據轉化為
ISO-8859-1
的格式,然后傳遞到數據庫中,在數據庫保存數據時,它默認即以
ISO-8859-1
保存,所以,這是為什么我們常常在數據庫中讀出的中文數據是亂碼。
???
對于
JAVA
程序和數據庫之間的數據傳遞,我們可以用圖
4
清晰地表示出來:
圖
4
?
3
、分析常見的
JAVA
中文問題幾個必須清楚的原則
???
首先,經過上面的詳細分析,我們可以清晰地看到,任何
JAVA
程序的生命期中,其編碼轉換的關鍵過程是在于:最初編譯成
class
文件的轉碼和最終向用戶輸出的轉碼過程。
???
其次,我們必須了解
JAVA
在編譯時支持的、常用的編碼格式有以下幾種:
??? *ISO-8859-1
,
8-bit,
同
8859_1,ISO-8859-1,ISO_8859_1
等編碼
??? *Cp1252
,美國英語編碼,同
ANSI
標準編碼
??? *UTF-8
,同
unicode
編碼
??? *GB2312
,同
gb2312-80,gb2312-1980
等編碼
??? *GBK ,
同
MS936
,它是
gb2312
的擴充
?
??
及其它的編碼,如韓文、日文、繁體中文等。同時,我們要注意這些編碼間的兼容關體
系如下:
???
unicode
和
UTF-8
編碼是一一對應的關系
。
GB2312
可以認為是
GBK
的子集
,即
GBK
編碼是在
gb2312
上擴展來的。同時,
GBK
編碼包含了
20902
個漢字,編碼范圍為:
0x8140-0xfefe
,所有的字符可以一一對應到
UNICODE2.0
中來。
???
再次,對于放在操作系統中的
.java
源程序文件,在編譯時,我們可以指定它內容的編
碼格式,具體來說用
-encoding
來指定。注意:如果源程序中含有中文字符,而你用
-encod
ing
指定為其它的編碼字符,顯然是要出錯的。用
-encoding
指定源文件的編碼方式為
GBK
或
gb2312
,無論我們在什么系統上編譯含有中文字符的
JAVA
源程序都不會有問題,它都會正確地將中文轉化為
UNICODE
存儲在
class
文件中。
然后,我們必須清楚,幾乎所有的
WEB
容器在其內部默認的字符編碼格式都是以
ISO-8859-1
為默認值的,同時,幾乎所有的瀏覽器在傳遞參數時都是默認以
UTF-8
的方式來傳遞參數的。所以,雖然我們的
Java
源文件在出入口的地方指定了正確的編碼方式,但其在容器內部運行時還是以
ISO-8859-1
來
處理的。
4
、中文問題的分類及其建議最優解決辦法
???
了解以上
JAVA
處理文件的原理之后,我們就可以提出了一套建議最優的解決漢字問題的辦法。
???
我們的目標是:我們在中文系統中編輯的含有中文字符串或進行中文處理的
JAVA
源程序經編譯后可以移值到任何其它的操作系統中正確運行,或拿到其它操作系統中編譯后能正確運行,能正確地傳遞中文和英文參數,能正確地和數據庫交流中英文字符串。
???
我們的具體思路是:在
JAVA
程序轉碼的入口和出口及
JAVA
程序同用戶有輸入輸出轉換的地方限制編碼方法使之正確即可
。
???
具體解決辦法如下:
??? 1
、
針對直接在
console
上運行的類
???
對于這種情況,我們建議在程序編寫時,如果需要從用戶端接收用戶的可能含有中文的
輸入或含有中文的輸出,程序中應該采用字符流來處理輸入和輸出,具體來說,
應用以下面向字符型節點流類型
:
???
對文件:
FileReader
,
FileWrieter
???????
????
其字節型節點流類型為:
FileInputStream
,
FileOutputStream
???
對內存(數組):
CharArrayReader
,
CharArrayWriter
???????
???????????
其字節型節點流類型為:
ByteArrayInputStream
,
ByteArrayOutputStream
???
對內存(字符串):
StringReader
,
StringWriter
???
對管道:
PipedReader
,
PipedWriter
???????
????
其字節型節點流類型為:
PipedInputStream
,
PipedOutputStream
同時,應該
用以下面向字符型處理流來處理輸入和輸出
:
??? BufferedWriter
,
BufferedReader
???????
????
其字節型的處理流為:
BufferedInputeStream
,
BufferedOutputStream
???
InputStreamReader
,
OutputStreamWriter
???
????????
其字節型的處理流為:
DataInputStream
,
DataOutputStream
???
其中
InputStreamReader
和
InputStreamWriter
用于將字節流按照指定的字符編碼集轉換到字符流
,如:
??? InputStreamReader in = new InputStreamReader(System.in
,
"GB2312")
;
??? OutputStreamWriter out = new OutputStreamWriter (System.out
,
"GB2312")
;
???
例如:采用如下的示例
JAVA
編碼就達到了要求:
//Read.java
import java.io.*;
public class Read {
public static void main(String[] args) throws IOException {
String str = "\n
中文測試,這是內部硬編碼的串
"+"\ntest english character";
String strin= "";
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb23
12")); //
設置輸入接口按中文編碼
BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"g
b2312")); //
設置輸出接口按中文編碼
stdout.write("
請輸入
:");
stdout.flush();
strin = stdin.readLine();
stdout.write("
這是從用戶輸入的串:
"+strin);
stdout.write(str);
stdout.flush();
}}
???
同時,在編譯程序時,我們用以下方式來進行:
??? javac -encoding gb2312 Read.java
???
其運行結果如圖
5
所示:
?
???
圖
5
??? 2
、
針對
EJB
類和不可以直接運行的支持類
(
如
JavaBean
類
)
???
由于這種類它們本身被其它的類調用,不直接與用戶交互,故對這種類來說,我們的建
議的處理方式是內部程序中應該采用字符流來處理程序內部的中文字符串(具體如上面一節
中一樣),同時,在編譯類時用
-encoding gb2312
參數指示源文件是中文格式編碼的即可。
??? 3
、
針對
Servlet
類
???
針對
Servlet
,我們建議用以下方法:
???
在編譯
Servlet
類的源程序時,用
-encoding
指定編碼為
GBK
或
GB2312
,且在向用戶輸出
時的編碼部分用
response
對象的
setContentType("text/html;charset=GBK");
或
gb2312
來設
置輸出編碼格式,同樣在接收用戶輸入時,我們用
request.setCharacterEncoding("GB231
2")
;這樣無論我們的
servlet
類移植到什么操作系統中,只有客戶端的瀏覽器支
持中文顯示
,就可以正確顯示。如下是一個正確的示例:
//HelloWorld.java
package hello;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void init() throws ServletException { }
public void doGet(HttpServletRequest request, HttpServletResponse response) thr
ows IOException, ServletException
{
request.setCharacterEncoding("GB2312"); //
設置輸入編碼格式
response.setContentType("text/html;charset=GB2312"); //
設置輸出編碼格式
PrintWriter out = response.getWriter(); //
建議使用
PrintWriter
輸出
out.println("<hr>");
out.println("Hello World! This is created by Servlet!
測試中文
!");
out.println("<hr>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) th
rows IOException, ServletException
{
request.setCharacterEncoding("GB2312"); //
設置輸入編碼格式
response.setContentType("text/html;charset=GB2312"); //
設置輸出編碼格式
String name = request.getParameter("name");
String id = request.getParameter("id");
if(name==null) name="";
if(id==null) id="";
PrintWriter out = response.getWriter(); //
建議使用
PrintWriter
輸出
out.println("<hr>");
out.println("
你傳入的中文字串是:
" + name);
out.println("<hr>
你輸入的
id
是:
" + id);
out.println("<hr>");
}
public void destroy() { }
}
???
請用
javac -encoding gb2312 HelloWorld.java
來編譯此程序。
???
測試此
Servlet
的程序如下所示:
<%@page contentType="text/html; charset=gb2312"%>
<%request.setCharacterEncoding("GB2312");%>
<html><head><title></title>
<Script language="JavaScript">
function Submit() {
//
通過
URL
傳遞中文字符串值給
Servlet
document.base.action = "./HelloWorld?name=
中文
";
document.base.method = "POST";
document.base.submit();
}
</Script>
</head>
<body bgcolor="#FFFFFF" text="#000000" topmargin="5">
<form name="base" method = "POST" target="_self">
<input name="id" type="text" value="" size="30">
<a href = "JavaScript:Submit()">
傳給
Servlet</a>
</form></body></html>
???
其運行結果如圖
6
所示:
?
???
圖
6
??? 4
、
JAVA
程序和數據庫之間
???
為避免
JAVA
程序和數據庫之間數據傳遞出現亂碼現象,我們建議采用以下最優方法來處
理:
??? 1
、
對于
JAVA
程序的處理方法按我們指定的方法處理。
??? 2
、
把數據庫默認支持的編碼格式改為
GBK
或
GB2312
的。
???
如:在
mysql
中,我們可以在配置文件
my.ini
中加入以下語句實現:
???
在
[mysqld]
區增加:
??? default-character-set=gbk
???
并增加:
??? [client]
??? default-character-set=gbk
???
在
SQL Server2K
中,我們可以將數據庫默認的語言設置為
Simplified Chinese
來達到目
的。
??? 5
、
針對
JSP
代碼
???
由于
JSP
是在運行時,由
WEB
容器進行動態編譯的,如果我們沒有指定
JSP
源文件的編碼
格式,則
JSP
編譯器會獲得服務器操作系統的
file.encoding
值來對
JSP
文件編譯的,它在移
植時最容易出問題,如在中文
win2k
中可以很好運行的
jsp
文件拿到英文
linux
中就不行,盡
管客戶端都是一樣的,那是因為容器在編譯
JSP
文件時獲取的操作系統的編碼不同造成的(
在中文
wink
中的
file.encoding
和在英文
Linux
中
file.encoding
是不同的,且英文
Linux
的
f
ile.encoding
對中文不支持,所以編譯出來的
JSP
類就會有問題)。網絡上討論的大多數是
此類問題,多是因為
JSP
文件移植平臺時不能正確顯示的問題,對于這類問題,我們了解了
JAVA
中程序編碼轉換的原理,解決起來就容易多了。我們建議的解決辦法如下:
??? 1
、我們要保證
JSP
向客戶端輸出時是采用中文編碼方式輸出的,即無論如何我們首先在
我們的
JSP
源代編中加入以下一行:
??? <%@page contentType="text/html; charset=gb2312"%>
??? 2
、為了讓
JSP
能正確獲得傳入的參數,我們在
JSP
源文件頭加入下面一句:
??? <%request.setCharacterEncoding("GB2312");%>
??? 3
、為了讓
JSP
編譯器能正確地解碼我們的含有中文字符的
JSP
文件,我們需要在
JSP
源文
件中指定我們的
JSP
源文件的編碼格式,具體來說,我們在
JSP
源文件頭上加入下面的一句即
可:
??
?<%@page pageEncoding="GB2312"%>
或
<%@page pageEncoding="GBK"%>
???
這是
JSP
規范
2.0
新增加的指令。
???
我們建議使用此方法來解
JSP
文件中的中文問題,下面的代碼是一個正確做法的
JSP
文件
的測試程序:
//testchinese.jsp
<%@page pageEncoding="GB2312"%>
<%@page contentType="text/html; charset=gb2312"%>
<%request.setCharacterEncoding("GB2312");%>
<%
String action = request.getParameter("ACTION");
String name = "";
String str = "";
if(action!=null && action.equals("SENT"))
{
name = request.getParameter("name");
str = request.getParameter("str");
}
%>
<html>
<head>
<title></title>
<Script language="JavaScript">
function Submit()
{
document.base.action = "?ACTION=SENT&str=
傳入的中文
";
document.base.method = "POST";
document.base.submit();
}
</Script>
</head>
<body bgcolor="#FFFFFF" text="#000000" topmargin="5">
<form name="base" method = "POST" target="_self">
<input type="text" name="name" value="" size="30">
<a href = "JavaScript:Submit()">
提交
</a>
</form>
<%
if(action!=null && action.equals("SENT"))
{
out.println("<br>
你輸入的字符為:
"+name);
out.println("<br>
你通過
URL
傳入的字符為:
"+str);
}
%>
</body>
</html>
???
如圖
7
是此程序運行的結果示意圖:
?
???
圖
7
5
、總結
???
在上面的詳細分析中,我們清晰地給出了
JAVA
在處理源程序過程中的詳細轉換過程,為我們正確解決
JAVA
編程中的中文問題提供了基礎。同時,我們給出了認為是最優的解決
JAVA
中文問題的辦法。
6
、參考資料
??? 1
、段明輝
.Java
編程技術中漢字問題的分析及解決
.
??????? http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml
??? 2
、
周競濤
.
關于
Java
中文問題的幾條分析原則
??????? http://www-900.ibm.com/developerWorks/cn/java/l-javachinese/index.shtml
??? 7
、作者介紹
???????
作者:
abnerchai
,高級程序員,作者聯系方法:
josserchai@yahoo.com