📄 18.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="description" content="Java,JDBC,EJB,Open Source,jdk,rmi">
<meta name="Keywords"
content="Java, servlets, Java servlet, Javascript, ActiveX, VRML,
applet, applets, directory, news, jdbc, applications,
Java applications, Java developer, Java development, developer,
classes, Jars.com, Jars, intranet, Java applet, Javabeans,
Java products, JDK, Java development kit, java development environment, JIT,
JavaPlan, enterprise tools, JVM, Java Virtual Machine, Java resources,
SUN, CGI, Perl, database, network, html,
xml, dhtml, rating, ratings, review, jars, cgi, programming,
software review, software rating">
<title>csdn_JDK1.2关于JDBC中文问题的解决方案</title>
<style>
.news { BACKGROUND: #007cd3; font-family: "宋体"; font-size: 9pt }
.t { font-family: "宋体"; font-size: 9pt }
.t1 { color:#007cd3; font-family: "宋体"; font-size: 9pt }
.white { font-family: "宋体"; font-size: 9pt;color:#FFFFFF }
.red { font-family: "宋体"; font-size: 9pt;color:#FF0000 }
A:visited {color:#0000FF}
A:hover {color: #ff6666; text-decoration: none}
.text {font-size: 12px; line-height: 160%; font-family: "宋体"}
.text1 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text1:visited {color:#000000}
.text1:hover {color: #000000}
.text2 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text2:visited {color:#000000}
.text2:hover {color: #000000}
.text3 {font-size: 12px; line-height: 100%; font-family: "宋体"; text-decoration: none}
.large {font-size: 14.8px; line-height: 130%}
</style>
</head>
<body
<center>
<tr>
<td WIDTH="100%" VALIGN="TOP">
<tr>
<td WIDTH="100%" CLASS="white"></td>
</tr>
<tr>
<td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>JDK1.2关于JDBC中文问题的解决方案 </td>
<p></p>
</tr>
<tr> <td WIDTH="100%" bordercolor="#FFFFFF" CLASS="t" bgcolor="#F0F0F0" colspan="2">
<br>
忙了几天,终于对JDK1.2的JDBC中文问题有了初步的了解,虽然还有问题存在,但我 <br>
想大家可能都着急了吧?:)所以就把我的初步想法先贴出来,欢迎大家补充. <br>
JDK1.2的中文问题主要是由于引入了Unicode引起的(其实在1.1版本中就有了),U <br>
nicode的字符由16bit构成,关于Unicode更详细的信息有兴趣者可以到www.unico <br>
de.org查阅,在1.0版本中,一个中文是由两个char(8bit)组成的,而1.1以上版本中 <br>
是由一个char(16bit)组成的.这一点大家可以用System.out.println(s.length( <br>
))语句来证实,其中s为中文字串. <br>
现在来说说解决办法,首先声明这些结果只是在我的环境里测试通过,如果在各位 <br>
的环境里有问题,请务必告知. <br>
我的环境是JDK1.2+Win95+Sybase JDBC Driver(PowerJ2.5附带)+Oracle JDBC D <br>
river(Oracle8.0.3附带). <br>
我的第一个体会是用JDBC-ODBC桥接访问数据库中文输入有问题,我还没解决,我用 <br>
的JDBCODBC Driver是JDK1.2自带的. <br>
第二个体会是用JDBC直接联数据库,这时可能有两种情况: <br>
1,中文输入没问题(Oracle8),即可以在SQL语句中直接写中文,如: <br>
statement.executeUpdate("inser into tablename values("测试",....) <br>
2,中文输入有问题(Sybase11),看错误可知是Unicode转换引起的,解决办法是将U <br>
nicode转换为ASCII形式,即一个汉字拆成两个char,用到两个类ByteToCharConve <br>
rter和CharToByteConverter,在sun.io.*中,可以在JDK home\jre\lib\i18n.jar <br>
中找到,没有文档,我也实在网上找到用法的. <br>
在输入时,用ChineseStringToAscii转换为ASCII码字串,查询时用AsciiToChines <br>
eString转换为Unicode字串.源代码如下: <br>
public static String AsciiToChineseString(String s) { <br>
char[] orig = s.toCharArray(); <br>
byte[] dest = new byte[orig.length]; <br>
for (int i=0;i<orig.length;i++) <br>
dest[i] = (byte)(orig[i]&0xFF); <br>
try { <br>
ByteToCharConverter toChar = ByteToCharConverter.getConverter("g <br>
b2312"); <br>
return new String(toChar.convertAll(dest)); <br>
} <br>
catch (Exception e) { <br>
System.out.println(e); <br>
return s; <br>
} <br>
} <br>
<br>
public static String ChineseStringToAscii(String s) { <br>
try { <br>
CharToByteConverter toByte = CharToByteConverter.getConverter("g <br>
b2312"); <br>
byte[] orig = toByte.convertAll(s.toCharArray()); <br>
char[] dest = new char[orig.length]; <br>
for (int i=0;i<orig.length;i++) <br>
dest[i] = (char)(orig[i] & 0xFF); <br>
return new String(dest); <br>
} <br>
catch (Exception e) { <br>
System.out.println(e); <br>
return s; <br>
} <br>
} <br>
主程序片断如下: <br>
try{ <br>
Statement stmt; <br>
Class.forName("com.sybase.jdbc.SybDriver"); <br>
Connection conn =DriverManager.getConnection ("jdbc:sybase:Tds:202.9 <br>
7.228.249:5000/todo","sa",""); <br>
stmt = conn.createStatement (); <br>
String s="何海涛"; <br>
s=ChineseStringToAscii(s); <br>
stmt.executeUpdate ("insert into russia values('"+s+"',1,1,'"+s+ <br>
"')"); <br>
}catch(Exception e){ <br>
System.out.println(e); <br>
} <br>
在读数据时用String s=AsciiToChineseString(rs.getString(1)) <br>
-------------------- <br>
因为手头只能对这两种数据库进行测试,所以对别的数据库可能出现的情况不能保 <br>
证.不过我估计基本是上面这两种情况.另外,用JDK1.2有的公司提供的Driver也升 <br>
级了,比如Sybase原来的Driver就不好使.原理就是这样,在实际操作中要靠自己摸 <br>
索了.上面两个方法参考了台湾某BBS的一篇文章. <br>
另外,yzhang不知你要的是什么版本,你可以在jconnect软件安装的目录下找JDBC <br>
Driver包,可能的格式是zip或jar,把他拷出来就行了.我的就是从PowerJ中拷出 <br>
来的 <br>
</td>
</tr>
</td>
</tr>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -