程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> JAVA開發中的中文處理問題

JAVA開發中的中文處理問題

編輯:JAVA編程入門知識
  ■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 服務器上,運行卻出現故障——返回的網頁不能顯示中文,應為中文的信息全為亂碼;用中文信息做要害字,不能正確檢索數據庫。後來采用加入檢查代碼等方法探知故障原因如下:
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved