只能存储前 七八个中文字符,其他内容被截去,导致存储内容的不完整(有些数据库不存在这个问题, 如 Sybase SQL Anywhere 5.0。JDBC-ODBC Bridge 还存在无法建表的 Bug) 。 对于广大需要存储中文信息的 Java
程序员来说,这可是一个不好的消息。要么改用其他语 言编程,要么选择其他价格昂贵的数据库产品。 “一次编写,到处运行”的目标,也大打折 扣。 能不能采用变通的方法, 将中文信息进行处理后再存储来解决这个
问题呢?答案是肯定 的。 解决问题的具体思路、方法 Java 采用 Unicode 码编码方式, 中英文字符均采用 16bit 存储。 既然存储英文信息是正确的, 根据一定规则,将中文信息转换成英文信息后存储,自然不会出现截尾现象。读取信息时再 进行逆向操作,将英文信息还原成中文信息即可。由 GB2312 编码规则可知,汉字一般为二 个高位为 1 的 ASCII 码,在转换时将一个汉字的二个高位 1 去掉,还原时再将二个高位 1 加 上。为了处理含有英文字符的中文字串,对英文字符则需要加上一个 Byte 0 标记。以下提供 的两个公用静态方法,可加入任何一个类中使用。 将中英文字串转换成纯英文字串
public static String toTureAsciiStr(String str){ StringBuffersb = new StringBuffer(); byte[] bt = str.getBytes(); for(int i =0 ;i〈bt.length;i++){ if(bt[i]〈0){ //是汉字去高位 1 sb.append((char)(bt[i]&;&;0x7f)); }else{//是英文字符补 0 作记录 sb.append((char)0); sb.append((char)bt[i]); } } returnsb.toString(); } 将经转换的字串还原 public static String unToTrueAsciiStr(String str){ byte[] bt = str.getBytes(); inti,l=0,length = bt.length,j=0; for(i = 0;i 〈 length;i++){ if(bt[i] == 0){ l++; } } byte []bt2 = new byte[length-l]; i++; bt2[j] = bt[i]; }else{ for(i =0 ;i 〈 length;i++){ if(bt[i] ==
0){
bt2[j] = (byte)(bt[i]|0x80); return tt; }
}
j++;
}
String tt = new String(bt2);
上例在实际编程中效果很好, 只是存储的中文信息需要经过同样处理, 才能被其他系统使用。
而且如果中文字串出现英文字符,实际上增加了额外的存储空间。 5.Solaris 下 Servlet 编程的中文问题及解决办法 在使用
Java 开发 Internet 上的一个应用
系统时, 发现在 Windows 下调试完全正常的 Servlet, 上传到 Solaris 服务器上,运行却出现故障——返回的网页不能显示中文,应为中文的信息 全为乱码;用中文信息做关键字,不能正确检索数据库。后来采用加入检查代码等方法探知 故障原因如下: 显示乱码主要是因为通过类 HttpServletResponse 提供的方法 setContentType 无法改变返回给 客户的数据的编码方式,正确的编码方式应为 GB2312 或者 GBK,而事实上为缺省的 ISO8859-1。 无法检索中文信息则是因为, 客户提交的中文信息经浏览器编码到达服务器后, Servlet 无法将其正确解码。
举例说明显示乱码解决方法 Servlet 一般通常做法如下: public class ZldTestServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response)throwsServletException,IOException{ //在使用 Writer 向浏览器返回数据前, 设置 content-type header, 在这里设置相应的字 符集 gb2312 response.setContentType("text/html;charset=gb2312"); PrintWriter out = response.getWriter(); //* // 正式返回数据 out.println("〈html〉 〈head〉 〈title〉Servlet test〈/title〉 〈/head〉" ); out.println("这是一个测试页!"); out.println("〈/body〉 〈/html〉"); out.close(); } ... } 解决页面显示乱码问题,需将*处代码换成如下内容: PrintWriter out = new OutputStreamWriter(response.getOutputStream(),"gb2312")); Solaris 中文信息检索问题的解决 浏览器利用表