当前位置: 首页 > 图灵资讯 > 技术篇> JDK1.2关于JDBC中文问题的解决方案

JDK1.2关于JDBC中文问题的解决方案

来源:图灵教育
时间:2024-03-03 10:37:05
忙了几天,终于对JDK1.2的JDBC中文问题有了初步的了解。虽然还有问题,但我想大家可能都很担心。:)所以先贴出我的初步想法,欢迎补充。. JDK1.2的中文问题主要是由于Unicode的引入(实际上是在1.1版本中),Unicode的字符由16bit组成,对Unicode更详细的信息感兴趣的人可以到wwww.unicode.在1.0版本中,org查阅,一个中文由两个char(8bit)组成,1.1以上版本由一个char(16bit)组成。你可以使用system.out.println(s.length())句子被证实,其中s是中文字串. 如今,我们来谈谈解决方案,首先声明这些结果只是在我的环境中通过了测试,如果在你的环境中有问题,请务必告知. 我的环境是JDK1.2+Win95+SybaseJDBCDriver(PowerJ2.5附带)+OracleJDBCDriver(Oracle8.0.3附带). 我的第一次经历是用JDBC-ODBC桥访问数据库中文输入有问题,我还没有解决,JDK1.2自带JDBCODBCDriver. 第二种体验是直接用JDBC连接数据库,此时可能有两种情况: 1.中文输入没有问题(Oracle8),也就是说,中文可以直接写在SQL语句中,如: statement.executeUpdate("inserintotablenamevalues(测试),...) 2.中文输入有问题(Sybase11)。从错误中可以看出,它是由Unicode转换引起的。解决方案是将Unicode转换为ASCII形式,即将一个汉字分成两个char,使用两类Bytetocharconverter和chartobyteconverter,在sunn.io.*在JDKhome中,jre\lib\i18n.在jar中找到,没有文档,我也真的在网上找到了用法。. 输入时,将ChinestringToAscii转换为ASCII字串,查询时,Ascitochinestring转换为Unicode字串。源代码如下: publicstaticStringAsciiToChineseString(Strings){ char[]orig=s.toCharArray(); byte[]dest=newbyte[orig.length]; for(inti=0;i<orig.length;i++) dest[i] = (byte)(orig[i]&0xFF); try { ByteToCharConverter toChar = ByteToCharConverter.getConverter(gb2312); 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(gb2312); 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.97.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.2Driver也被升级。例如,Sybase的原始Driver不容易使用。原则是这样的。在实践中,我们必须自己探索。以上两种方法参考了台湾BBS的一篇文章. 另外,yzhang不知道你想要什么版本,在jconnect软件安装目录下,您可以找到JDBC Driver包,可能的格式是zip或jar,只需复制即可。我的是从PowerJ中复制的