關於JDK1.2的JDBC中文問題的解決 (轉)
關於JDK1.2的JDBC中文問題的解決 (轉)[@more@]忙了幾天,終於對1.2的JC中文問題有了初步的瞭解,雖然還有問題存在,但我想大家可能都著急了吧?:)所以就把我的初步想法先貼出來,歡迎大家補充. JDK1.2的中文問題主要是由於引入了Unicode引起的(其實在1.1版本中就有了),Unicode的字元由16bit構成,關於Unicode更詳細的資訊有興趣者可以到查閱,在1.0版本中,一箇中文是由兩個char(8bit)組成的,而1.1以上版本中是由一個char(16bit)組成的.這一點大家可以用System.out.println(s.length())語句來證實,其中s為中文字串. 現在來說說解決辦法,首先宣告這些結果只是在我的環境裡測試透過,如果在各位的環境裡有問題,請務必告知.
我的環境是JDK1.2+Win95+ (PowerJ2.5附帶)+ JDBC Driver(Oracle8.0.3附帶). 我的第一個體會是用JDBC-ODBC橋接訪問中文輸入有問題,我還沒解決,我用的JDBCODBC Driver是JDK1.2自帶的. 第二個體會是用JDBC直接聯資料庫,這時可能有兩種情況: 1,中文輸入沒問題(Oracle8),即可以在語句中直接寫中文,如:
statement.executeUpdate("inser into tablename values("測試",....) 2,中文輸入有問題(Sybase11),看錯誤可知是Unicode轉換引起的,解決辦法是將Unicode轉換為ASCII形式,即一個漢字拆成兩個char,用到兩個類ByteToCharConverter和CharToByteConverter,在sun.io.*中,可以在JDK homelibi18n.jar中找到,沒有文件,我也實在網上找到用法的.
在輸入時,用ChineseStringToAscii轉換為ASCII碼字串,查詢時用AsciiToChineseString轉換為Unicode字串.如下:
public static String AsciiToChineseString(String s) {
char[] orig = s.toCharArray();
byte[] dest = new byte[orig.length];
for (int i=0;idest[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;idest[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);
}
在讀資料時用String s=AsciiToChineseString(rs.getString(1))
--------------------
因為手頭只能對這兩種資料庫進行測試,所以對別的資料庫可能出現的情況不能保證.不過我估計基本是上面這兩種情況.另外,用JDK1.2有的公司提供的Driver也升級了,比如Sybase原來的Driver就不好使.原理就是這樣,在實際操作中要靠自己摸索了.上面兩個方法參考了臺灣某BBS的一篇文章. 另外,yzhang不知你要的是什麼版本,你可以在jconnect的目錄下找JDBC Driver包,可能的格式是zip或jar,把他拷出來就行了.我的就是從PowerJ中拷出來的
我的環境是JDK1.2+Win95+ (PowerJ2.5附帶)+ JDBC Driver(Oracle8.0.3附帶). 我的第一個體會是用JDBC-ODBC橋接訪問中文輸入有問題,我還沒解決,我用的JDBCODBC Driver是JDK1.2自帶的. 第二個體會是用JDBC直接聯資料庫,這時可能有兩種情況: 1,中文輸入沒問題(Oracle8),即可以在語句中直接寫中文,如:
statement.executeUpdate("inser into tablename values("測試",....) 2,中文輸入有問題(Sybase11),看錯誤可知是Unicode轉換引起的,解決辦法是將Unicode轉換為ASCII形式,即一個漢字拆成兩個char,用到兩個類ByteToCharConverter和CharToByteConverter,在sun.io.*中,可以在JDK homelibi18n.jar中找到,沒有文件,我也實在網上找到用法的.
在輸入時,用ChineseStringToAscii轉換為ASCII碼字串,查詢時用AsciiToChineseString轉換為Unicode字串.如下:
public static String AsciiToChineseString(String s) {
char[] orig = s.toCharArray();
byte[] dest = new byte[orig.length];
for (int i=0;i
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
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);
}
在讀資料時用String s=AsciiToChineseString(rs.getString(1))
--------------------
因為手頭只能對這兩種資料庫進行測試,所以對別的資料庫可能出現的情況不能保證.不過我估計基本是上面這兩種情況.另外,用JDK1.2有的公司提供的Driver也升級了,比如Sybase原來的Driver就不好使.原理就是這樣,在實際操作中要靠自己摸索了.上面兩個方法參考了臺灣某BBS的一篇文章. 另外,yzhang不知你要的是什麼版本,你可以在jconnect的目錄下找JDBC Driver包,可能的格式是zip或jar,把他拷出來就行了.我的就是從PowerJ中拷出來的
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989748/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於Failed to resolve的問題解決AI
- 徹底解決關於CSocket類的Receive超時的問題(轉)
- 解決Hexo關於圖片的問題Hexo
- 關於解決問題的幾個段位
- 怎樣成為解決問題的高手?——關於問題解決的關鍵4步驟
- 關於 LF will be replaced by CRLF 問題的解決方式
- JDBC Oracle executeUpdate 卡死問題解決JDBCOracle
- Oracle:sqlplus查詢出的中文是亂碼問題的解決(轉)OracleSQL
- 關於 PHP Session ID 改變的問題解決PHPSession
- 解決關於IIS gzip不能正常啟用的問題
- 關於input的一些問題解決方法分享
- URL地址中的中文亂碼問題的解決
- 解決中文亂碼問題
- MySQL 中文 like 問題解決MySql
- 關於Xcode10中libstdc報錯問題的解決XCode
- 關於tomcat在idea上的中文編碼問題TomcatIdea
- Sublime Text 3 中文亂碼問題的解決
- LiveCharts中文顯示亂碼問題的解決Echarts
- 關於heroku的lookup api.heroku.com on 127.0.1.1:53問題解決API
- 關於onethink移植後登陸不了後臺問題的解決
- 關於分散式事務帶來的問題及解決方案分散式
- 關於JS的浮點數計算精度問題解決方案JS
- springmvc 解決中文亂碼問題SpringMVC
- MySql中文亂碼問題解決MySql
- Jmeter 解決中文亂碼問題JMeter
- 解決Eclipse中文註釋部分亂碼的問題Eclipse
- Mysql中文亂碼問題的最佳解決方法MySql
- 關於網路硬體配置出現問題,無法上網問題的解決
- 關於Quartus的start按鈕灰色無法下載的問題的解決
- 關於 a 標籤跳轉問題
- 關於移動端小圖示模糊問題的解決方法教程
- 關於Android檔案數過大,分包問題的解決辦法Android
- Git — 關於 LF will be replaced by CRLF 問題出現的原因以及解決方式Git
- 關於解決Server Tomcat v9.0 Server at localhost failed to start的問題ServerTomcatlocalhostAI
- 關於mysql查詢字符集不匹配問題的解決方法MySql
- 關於解決主機和虛擬機器ping不通的問題虛擬機
- 一個關於JS解決陣列相乘問題JS陣列
- 關於this指向的問題
- 關於git的ssh-key:解決本地多個ssh-key的問題Git