■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 服務器上,運行卻出現故障——返回的網頁不能顯示中文,應為中文的信息全為亂碼;用中文信息做要害字,不能正確檢索數據庫。後來采用加入檢查代碼等方法探知故障原因如下: