JDBC中文處理

我們在做一個JAVA的應用,不可避免地要處理中文。經過
艱苦的探索,目前有一些進展,找到了一些解決方法,但仍然
面臨着無法解決的問題。在此作一整理,希望對大家有所幫助,
同時請各位高手幫忙考慮我們的問題。
Email: [email protected]

背景:
JDK 1.15
VCafe 2.0
JPadPro
SERVER:
NT IIS
Sybase System 10
JDBC: Jconnect
CLIENT:
Browser: Netscape 4.04 + Patch
PWin95 & Pwin98 Beta3

CLASS文件存放在 SERVER,由BROWSER 運行APPLET,APPLET只
起調入FRAME類主程序的作用。界面包括Text field, Text Area,
List, Choice 等。

一,取中文
用JDBC執行SELECT語句從SERVER取數據(中文)後,將數據
用APPEND方法加到TEXT AREA(TA),不能正確顯示。但加到
LIST中時,則大部分漢字可正確顯示。

處理:將數據按“ISO-8859-1”格式轉爲字節數組,再按系統
缺省編碼格式(default character encoding)轉爲STRING,即可在TA和LIST中正確顯示。
程序段如下:

dbstr2 = results.getString(1);
//*********************************************************************
// After read result from Database server, Convert the result string.

dbbyte1 = dbstr2.getBytes("iso-8859-1");
dbstr1 = new String(dbbyte1);
//*********************************************************************

二,寫中文到DB
處理方式與以上相逆,先將SQL語句按DEFAULT CHARACTER ENCODING
轉爲字節數組,再按ISO-8859-1轉爲STRING,然後送執行,
則中文信息可正確寫入DB。

sqlstmt = tf_input.getText();

//*****************************************************************************
// Before send statement to Database server, Convert sql statement.

dbbyte1 = sqlstmt.getBytes();
sqlstmt = new String(dbbyte1,"iso-8859-1");
//*****************************************************************************

_stmt = _con.createStatement();
_stmt.executeUpdate(sqlstmt);
。。。。。。

問題:
以上方法當本地客戶機上存在CLASSPATH指向JDK的CLASSES。ZIP
時(稱爲A情況),可正確運行。
但如果客戶機只有Browser,沒有JDK和CLASSPATH時
(稱爲B情況),則漢字無法正確轉換。

我們的分析:
1,
經過測試,在A情況下,程序運行時系統的default character
encoding = "GBK" or "GB2312".
在B情況下,程序啓動時,Browser 的JAVA CONSOLE中出現
如下信息:
can't find resource for
sun.awt.windows.awtLocalization_zh_CN
然後系統的
default characterencoding = "8859-1".

2,
如果在轉換字符串時不採用default character encoding,
而是直接採用“GBK”或“GB2312”,則在A情況下仍然可正常,
在B情況下,系統出現錯誤:UnsupportedEncodingException。

3,
在本地客戶機上,我把JDK的CLASSES。ZIP解壓後,放在另一個
目錄中,CLASSPATH只包含該目錄。然後逐步刪除目錄中的CLASS
文件,一邊運行測試程序,最後發現在一千多個CLASS文件中,
只有一個是不可缺少的,該文件是:
sun.io.CharToByteDoubleByte.class
我將該文件拷到SERVER端和其它的類放在一起,並在程序的開頭
IMPORT它,仍然在B情況下無法正常。

4,
在A情況下,如果在CLASSPTH中去掉
sun.io.CharToByteDoubleByte.class,則程序運行時,
測得default character encoding爲“8859-1”,否則爲
GBK 或GB2312。

5,
分析BROWSER程序NETSCAPE目錄下的文件
/program/java/classes/java40.jar, 發現其中沒有包括
sun.io.CharToByteDoubleByte.class,
不知這是需要升級,還是有其它方法可以解決?

盼望各位高手指導!Email: [email protected]

--
※ 來源:·BBS 水木清華站 bbs.net.tsinghua.edu.cn·[FROM: DHCP159_158.STU]

發信人: barebell (小心), 信區: Java
標 題: Re: ● ● JDBC中文處理:方法與問題
發信站: BBS 水木清華站 (Tue May 19 22:38:19 1998) WWW-POST

現在我們取得的一點小小進展,在轉換字符串時不採用default character
encoding,而是直接採用“GBK”或“GB2312”,在情況A和B底下,從DB取數據
都沒有問題,但是寫中文到DB也採用“GBK”或“GB2312”時,情況B仍是出錯的。

發信人: mah (chip), 信區: Java
標 題: 通過jdbc driver獲取數據庫中文信息揭密
發信站: BBS 水木清華站 (Tue Aug 11 20:42:16 1998) WWW-POST

當我們使用老外公司開發的jdbc第四類driver獲取數據庫中文信息時,常會出現亂碼現象
,如????D.
解決辦法1:
使用interface ResultSet的方法getBytes()得到一byte[],然後由此byte[]數組產生一
新的
String,可獲得正確的漢字,但此方法有一定的侷限性,在某些driver上可以實現,如
weblogic公司
開發的fastforward產品。另此種方法不規範,根據sun jdbc的標準varchar和var推薦用
getString()
方法來獲取。
解決辦法2:
使用interface ResultSet的方法getString(),這時我們得到的String一定是亂碼,如何
解決,
String temp = result.getString (s);
if (temp != null) {
byte[] b = temp.getBytes ("8859_1");
temp = new String (b);
此時的temp一定是正確的中文,,,,,,此種方法我在sybase公司開發的jconnect4上
實驗成功,在fastforward
上也成功。

發佈了117 篇原創文章 · 獲贊 1 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章