?? jdk1.2關(guān)于jdbc中文問題的解決方案.txt
字號:
作者:whitefox
email: whitefox.jiang@corp.elong.com
日期:2000-07-18 14:40:14
發(fā)信人: hht (Duke), 信區(qū): Java
標(biāo) 題: JDK1.2關(guān)于JDBC中文問題的解決方案&Re yzhang
發(fā)信站: 網(wǎng)易虛擬社區(qū) (Mon Jan 11 13:29:43 1999), 轉(zhuǎn)信
忙了幾天,終于對JDK1.2的JDBC中文問題有了初步的了解,雖然還有問題存在,但我
想大家可能都著急了吧?:)所以就把我的初步想法先貼出來,歡迎大家補(bǔ)充.
JDK1.2的中文問題主要是由于引入了Unicode引起的(其實(shí)在1.1版本中就有了),U
nicode的字符由16bit構(gòu)成,關(guān)于Unicode更詳細(xì)的信息有興趣者可以到www.unico
de.org查閱,在1.0版本中,一個中文是由兩個char(8bit)組成的,而1.1以上版本中
是由一個char(16bit)組成的.這一點(diǎn)大家可以用System.out.println(s.length(
))語句來證實(shí),其中s為中文字串.
現(xiàn)在來說說解決辦法,首先聲明這些結(jié)果只是在我的環(huán)境里測試通過,如果在各位
的環(huán)境里有問題,請務(wù)必告知.
我的環(huán)境是JDK1.2+Win95+Sybase JDBC Driver(PowerJ2.5附帶)+Oracle JDBC D
river(Oracle8.0.3附帶).
我的第一個體會是用JDBC-ODBC橋接訪問數(shù)據(jù)庫中文輸入有問題,我還沒解決,我用
的JDBCODBC Driver是JDK1.2自帶的.
第二個體會是用JDBC直接聯(lián)數(shù)據(jù)庫,這時可能有兩種情況:
1,中文輸入沒問題(Oracle8),即可以在SQL語句中直接寫中文,如:
statement.executeUpdate("inser into tablename values("測試",....)
2,中文輸入有問題(Sybase11),看錯誤可知是Unicode轉(zhuǎn)換引起的,解決辦法是將U
nicode轉(zhuǎn)換為ASCII形式,即一個漢字拆成兩個char,用到兩個類ByteToCharConve
rter和CharToByteConverter,在sun.io.*中,可以在JDK home\jre\lib\i18n.jar
中找到,沒有文檔,我也實(shí)在網(wǎng)上找到用法的.
在輸入時,用ChineseStringToAscii轉(zhuǎn)換為ASCII碼字串,查詢時用AsciiToChines
eString轉(zhuǎn)換為Unicode字串.源代碼如下:
public static String AsciiToChineseString(String s) {
char[] orig = s.toCharArray();
byte[] dest = new byte[orig.length];
for (int i=0;i<orig.length;i++)
dest[i] = (byte)(orig[i]&0xFF);
try {
ByteToCharConverter toChar = ByteToCharConverter.getConverter("g
b2312");
return new String(toChar.convertAll(dest));
}
catch (Exception e) {
System.out.println(e);
return s;
}
}
public static String ChineseStringToAscii(String s) {
try {
CharToByteConverter toByte = CharToByteConverter.getConverter("g
b2312");
byte[] orig = toByte.convertAll(s.toCharArray());
char[] dest = new char[orig.length];
for (int i=0;i<orig.length;i++)
dest[i] = (char)(orig[i] & 0xFF);
return new String(dest);
}
catch (Exception e) {
System.out.println(e);
return s;
}
}
主程序片斷如下:
try{
Statement stmt;
Class.forName("com.sybase.jdbc.SybDriver");
Connection conn =DriverManager.getConnection ("jdbc:sybase:Tds:202.9
7.228.249:5000/todo","sa","");
stmt = conn.createStatement ();
String s="何海濤";
s=ChineseStringToAscii(s);
stmt.executeUpdate ("insert into russia values('"+s+"',1,1,'"+s+
"')");
}catch(Exception e){
System.out.println(e);
}
在讀數(shù)據(jù)時用String s=AsciiToChineseString(rs.getString(1))
--------------------
因?yàn)槭诸^只能對這兩種數(shù)據(jù)庫進(jìn)行測試,所以對別的數(shù)據(jù)庫可能出現(xiàn)的情況不能保
證.不過我估計(jì)基本是上面這兩種情況.另外,用JDK1.2有的公司提供的Driver也升
級了,比如Sybase原來的Driver就不好使.原理就是這樣,在實(shí)際操作中要靠自己摸
索了.上面兩個方法參考了臺灣某BBS的一篇文章.
另外,yzhang不知你要的是什么版本,你可以在jconnect軟件安裝的目錄下找JDBC
Driver包,可能的格式是zip或jar,把他拷出來就行了.我的就是從PowerJ中拷出
來的
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -