在應用開發的過程中
總會遇到一些
難以理解
的系統缺陷和
不易解決
的問題
其實
通過認真分析
不必購買昂貴的產品依然可以解決多數問題
■JDBC ODBC Bridge的Bug及其解決方法
在編寫一數據庫管理程序時
發現JDBC
ODBC Bridge存在不易發現的Bug
在向數據表插入數據時
如果為英文字符
存儲內容完全正確
如果存入中文字符
部分數據庫只能存儲前七八個中文字符
其他內容被截去
導致存儲內容的不完整(有些數據庫不存在這個問題
如Sybase SQL Anywhere
JDBC
ODBC Bridge還存在無法建表的Bug)
對於廣大需要存儲中文信息的Java程序員來說
這可是一個不好的消息
要麼改用其他語言編程
要麼選擇其他價格昂貴的數據庫產品
一次編寫
到處運行
的目標
也大打折扣
能不能采用變通的方法
將中文信息進行處理後再存儲來解決這個問題呢?答案是肯定的
解決問題的具體思路
方法
Java采用Unicode碼編碼方式
中英文字符均采用
bit存儲
既然存儲英文信息是正確的
根據一定規則
將中文信息轉換成英文信息後存儲
自然不會出現截尾現象
讀取信息時再進行逆向操作
將英文信息還原成中文信息即可
由GB
編碼規則可知
漢字一般為二個高位為
的ASCII碼
在轉換時將一個漢字的二個高位
去掉
還原時再將二個高位
加上
為了處理含有英文字符的中文字串
對英文字符則需要加上一個Byte
標記
以下提供的兩個公用靜態方法
可加入任何一個類中使用
將中英文字串轉換成純英文字串
public static String toTureAsciiStr(String str){
StringBuffer sb = new StringBuffer();
byte[] bt = str
getBytes();
for(int i =
i〈btelse{//是英文字符 補
作記錄
sb
append((char)
);
sb
append((char)bt[i]);
}
}
return sb
toString();
}
將經轉換的字串還原
public static String unToTrueAsciiStr(String str){
byte[] bt = str
getBytes();
int i
l=
length = bt
length
j=
;
for(i =
;i〈length;i++){
if(bt[i] ==
){
l++;
}
}
byte []bt
= new byte[length
l];
for(i =
i〈length;i++){
if(bt[i] ==
){
i++;
bt
[j] = bt[i];
}else{
bt
[j] = (byte)(bt[i]|
x
);
}
j++;
}
String tt = new String(bt
);
return tt;
}
上例在實際編程中效果很好
只是存儲的中文信息需要經過同樣處理
才能被其他系統使用
而且如果中文字串出現英文字符
實際上增加了額外的存儲空間
■Solaris下Servlet編程的中文問題及解決辦法
在使用Java開發Internet上的一個應用系統時
發現在Windows下調試完全正常的Servlet
上傳到Solaris 服務器上
運行卻出現故障——返回的網頁不能顯示中文
應為中文的信息全為亂碼
用中文信息做關鍵字
不能正確檢索數據庫
後來采用加入檢查代碼等方法探知故障原因如下
顯示亂碼主要是因為通過類 HttpServletResponse提供的方法setContentType 無法改變返回給客戶的數據的編碼方式
正確的編碼方式應為GB
或者GBK
而事實上為缺省的ISO
無法檢索中文信息則是因為
客戶提交的中文信息經浏覽器編碼到達服務器後
Servlet無法將其正確解碼
舉例說明顯示亂碼解決方法
Servlet 一般通常做法如下
public class ZldTestServlet extends HttpServlet {
public void doGet (HttpServletRequest request
HttpServletResponse response)throws ServletException
IOException{
//在使用 Writer向浏覽器返回數據前
設置 content
type header
在這裡設置相應的字符集gb
response
setContentType(
text/html;charset=gb
);
PrintWriter out = response
getWriter(); //*
// 正式返回數據
out
println(
〈html〉〈head〉〈title〉Servlet test〈/title〉〈/head〉
);
out
println(
這是一個測試頁!
);
out
println(
〈/body〉〈/html〉
);
out
close();
}
}
解決頁面顯示亂碼問題
需將*處代碼換成如下內容
PrintWriter out = new PrintWriter(new OutputStreamWriter(response
getOutputStream()
gb
));
Solaris中文信息檢索問題的解決
浏覽器利用表單向服務器提交信息時
一般采用x
www
form
urlencoded 的MIME格式對數據進行編碼
如果使用get方法
參數名稱和參數值經編碼後附加在URL後
在Java中稱作查詢串(query string)
在Servlet程序中
如果采用ServletRequest的方法getParameter取得參數值
在Solaris環境下
對漢字卻不能正確解碼
因而無法正確檢索數據庫
在Java
的包——中提供了URLEncode和URLDecode類
類URLEncode提供了按x
www
form
urlencoded格式對給定串進行轉換的方法
類URLEncode則提供了逆方法
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19438.html