海鷗航際

          JAVA站
          posts - 11, comments - 53, trackbacks - 1, articles - 102

          JDBC中文處理--解答集合

          Posted on 2005-01-12 19:20 海天一鷗 閱讀(314) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE

          發(fā)信人: sailorc (ZZ), 信區(qū): Java
          標(biāo) 題: ● ● JDBC中文處理:方法與問題
          發(fā)信站: BBS 水木清華站 (Sun May 17 21:34:19 1998)

          ● ● JDBC中文處理:方法與問題

          我們?cè)谧鲆粋€(gè)JAVA的應(yīng)用,不可避免地要處理中文。經(jīng)過
          艱苦的探索,目前有一些進(jìn)展,找到了一些解決方法,但仍然
          面臨著無法解決的問題。在此作一整理,希望對(duì)大家有所幫助,
          同時(shí)請(qǐng)各位高手幫忙考慮我們的問題。
          Email: sailor@mailserv.stu.edu.cn

          背景:
          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 運(yùn)行APPLET,APPLET只
          起調(diào)入FRAME類主程序的作用。界面包括Text field, Text Area,
          List, Choice 等。

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

          處理:將數(shù)據(jù)按“ISO-8859-1”格式轉(zhuǎn)為字節(jié)數(shù)組,再按系統(tǒng)
          缺省編碼格式(default character encoding)轉(zhuǎn)為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
          轉(zhuǎn)為字節(jié)數(shù)組,再按ISO-8859-1轉(zhuǎn)為STRING,然后送執(zhí)行,
          則中文信息可正確寫入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);
          。。。。。。

          問題:
          以上方法當(dāng)本地客戶機(jī)上存在CLASSPATH指向JDK的CLASSES。ZIP
          時(shí)(稱為A情況),可正確運(yùn)行。
          但如果客戶機(jī)只有Browser,沒有JDK和CLASSPATH時(shí)
          (稱為B情況),則漢字無法正確轉(zhuǎn)換。

          我們的分析:
          1,
          經(jīng)過測(cè)試,在A情況下,程序運(yùn)行時(shí)系統(tǒng)的default character
          encoding = "GBK" or "GB2312".
          在B情況下,程序啟動(dòng)時(shí),Browser 的JAVA CONSOLE中出現(xiàn)
          如下信息:
          can't find resource for
          sun.awt.windows.awtLocalization_zh_CN
          然后系統(tǒng)的
          default characterencoding = "8859-1".

          2,
          如果在轉(zhuǎn)換字符串時(shí)不采用default character encoding,
          而是直接采用“GBK”或“GB2312”,則在A情況下仍然可正常,
          在B情況下,系統(tǒng)出現(xiàn)錯(cuò)誤:UnsupportedEncodingException。

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

          4,
          在A情況下,如果在CLASSPTH中去掉
          sun.io.CharToByteDoubleByte.class,則程序運(yùn)行時(shí),
          測(cè)得default character encoding為“8859-1”,否則為
          GBK 或GB2312。

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

          盼望各位高手指導(dǎo)!Email: sailor@mailserv.stu.edu.cn

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

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

          現(xiàn)在我們?nèi)〉玫囊稽c(diǎn)小小進(jìn)展,在轉(zhuǎn)換字符串時(shí)不采用default character
          encoding,而是直接采用“GBK”或“GB2312”,在情況A和B底下,從DB取數(shù)據(jù)
          都沒有問題,但是寫中文到DB也采用“GBK”或“GB2312”時(shí),情況B仍是出錯(cuò)的。

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

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

          主站蜘蛛池模板: 固安县| 利辛县| 曲靖市| 疏勒县| 富民县| 莫力| 静海县| 方山县| 鹤岗市| 和龙市| 新昌县| 平和县| 浦江县| 香港| 北流市| 嘉鱼县| 眉山市| 南乐县| 溆浦县| 巴彦淖尔市| 航空| 错那县| 阳新县| 长海县| 若尔盖县| 木兰县| 乃东县| 五寨县| 凭祥市| 尉犁县| 宜兴市| 邹平县| 正宁县| 尚义县| 封丘县| 上饶县| 临海市| 邹平县| 铜陵市| 内黄县| 松溪县|