明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

JDK1.2對(duì)于JDBC中文問題的處理方案

[摘要]發(fā)信人: hht (Duke), 信區(qū): Java 標(biāo)題: JDK1.2關(guān)于JDBC中文問題的解決方案&Re yzhang 發(fā)信站: 網(wǎng)易虛擬社區(qū) (Mon Jan 11 13:29:43 ...
發(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)信

忙了幾天,終于對(duì)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版本中,一個(gè)中文是由兩個(gè)char(8bit)組成的,而1.1以上版本中
是由一個(gè)char(16bit)組成的.這一點(diǎn)大家可以用System.out.println(s.length(
))語句來證實(shí),其中s為中文字串.
現(xiàn)在來說說解決辦法,首先聲明這些結(jié)果只是在我的環(huán)境里測(cè)試通過,如果在各位
的環(huán)境里有問題,請(qǐng)務(wù)必告知.
我的環(huán)境是JDK1.2+Win95+Sybase JDBC Driver(PowerJ2.5附帶)+Oracle JDBC D
river(Oracle8.0.3附帶).
我的第一個(gè)體會(huì)是用JDBC-ODBC橋接訪問數(shù)據(jù)庫中文輸入有問題,我還沒解決,我用
的JDBCODBC Driver是JDK1.2自帶的.
第二個(gè)體會(huì)是用JDBC直接聯(lián)數(shù)據(jù)庫,這時(shí)可能有兩種情況:
1,中文輸入沒問題(Oracle8),即可以在SQL語句中直接寫中文,如:
statement.executeUpdate("inser into tablename values("測(cè)試",....)
2,中文輸入有問題(Sybase11),看錯(cuò)誤可知是Unicode轉(zhuǎn)換引起的,解決辦法是將U
nicode轉(zhuǎn)換為ASCII形式,即一個(gè)漢字拆成兩個(gè)char,用到兩個(gè)類ByteToCharConve
rter和CharToByteConverter,在sun.io.*中,可以在JDK home\jre\lib\i18n.jar
中找到,沒有文檔,我也實(shí)在網(wǎng)上找到用法的.
在輸入時(shí),用ChineseStringToAscii轉(zhuǎn)換為ASCII碼字串,查詢時(shí)用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ù)時(shí)用String s=AsciiToChineseString(rs.getString(1))
--------------------
因?yàn)槭诸^只能對(duì)這兩種數(shù)據(jù)庫進(jìn)行測(cè)試,所以對(duì)別的數(shù)據(jù)庫可能出現(xiàn)的情況不能保
證.不過我估計(jì)基本是上面這兩種情況.另外,用JDK1.2有的公司提供的Driver也升
級(jí)了,比如Sybase原來的Driver就不好使.原理就是這樣,在實(shí)際操作中要靠自己摸
索了.上面兩個(gè)方法參考了臺(tái)灣某BBS的一篇文章.
另外,yzhang不知你要的是什么版本,你可以在jconnect軟件安裝的目錄下找JDBC
Driver包,可能的格式是zip或jar,把他拷出來就行了.我的就是從PowerJ中拷出
來的