JAVA开发中的中文处理问题

2016-02-19 13:43 1 1 收藏

下面图老师小编要向大家介绍下JAVA开发中的中文处理问题,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

【 tulaoshi.com - 编程语言 】

■JDBC ODBC Bridge的Bug及其解决方法
   !-- frame contents -- !-- /frame contents --   在编写一数据库治理程序时,发现JDBC-ODBC Bridge存在不易发现的Bug。在向数据表插入数据时,假如为英文字符,存储内容完全正确,假如存入中文字符,部分数据库只能存储前七八个中文字符,其他内容被截去,导致存储内容的不完整(有些数据库不存在这个问题,如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){
  
  StringBuffer sb = 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]);
  
   }
  
   }
  
  return sb.toString();
  
  }
  
  将经转换的字串还原
  public static String unToTrueAsciiStr(String str){
  
   byte[] bt = str.getBytes();
  
   int i,l=0,length = bt.length,j=0;
  
   for(i = 0;i〈length;i++){
  
   if(bt[i] == 0){
  
   l++;
  
   }
  
   }
  
   byte []bt2 = new byte[length-l];
  
   for(i =0 ;i〈length;i++){
  
   if(bt[i] == 0){
  
   i++;
  
   bt2[j] = bt[i];
  
   }else{
  
   bt2[j] = (byte)(bt[i] 0x80);
  
   }
  
   j++;
  
   }
  
  String tt = new String(bt2);
  
  return tt;
  
  }
  
  上例在实际编程中效果很好,只是存储的中文信息需要经过同样处理,才能被其他系统使用。而且假如中文字串出现英文字符,实际上增加了额外的存储空间。
  
  ■Solaris下Servlet编程的中文问题及解决办法
  在使用Java开发Internet上的一个应用系统时,发现在Windows下调试完全正常的Servlet,上传到Solaris 服务器上,运行却出现故障——返回的网页不能显示中文,应为中文的信息全为乱码;用中文信息做要害字,不能正确检索数据库。后来采用加入检查代码等方法探知故障原因如下:

来源:https://www.tulaoshi.com/n/20160219/1605045.html

延伸阅读
问题一:如保加载JDBC驱动程序: 正常我们加载驱动程序有三个途径:          1)Class.forName(String)这想当于classLoader一个String指定的类,在装载时把该驱动程序的静态内容都初始化,其实这时驱动程序类调用了DriverManager.registerDriver(driver)方法 2)使用系统属性:System...
今天在部署一个webservices程序的时候,从页面获取数据的servlet出现了乱码问题,在servlet中我已经把request.setCharacterEncoding("GB2312");这段文字加入到代码中去,但是还是出现乱麻问题。  到网上找资料,如下:JAVA是Unicode编码,你先转换成ISO8859-1,然后再转换成GBK或是GB2312. java 代码 代码如下: request.setCharacterE...
尽管关于Java中文问题的讨论已经相当多了,但由于Java的相关技术标准繁多,面向Java的Web服务器、应用服务器以及JDBC数据库驱动等都没有官方的标准,所以Java应用在处理中文时所存在的问题不仅没有消失而且随着所选用的服务器、驱动程序以及运行环境等因素的不同而变化。那么我们如何从众多现象中找出问题所在,并进行分析和解决呢?与大部...
问题一:如保加载JDBC驱动程序: 正常我们加载驱动程序有三个途径: 1)Class.forName(String)这想当于classLoader一个String指定的类,在装载时把该驱动程序的静态内容都初始化,其实这时驱动程序类调用了DriverManager.registerDriver(driver);方法 2)使用系统属性:System.getProperty().load(new FileInputStream(&q...
第一,final, finally, finalize的区别。 final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能...

经验教程

696

收藏

99
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部