jsp 網站優化----”亂碼無處可逃"
很多和我一樣開發jsp網站的朋友曾經遇到過很蛋疼的問題,往數據庫寫入的數據出現了亂碼,我的天啊!my god。
很多朋友可能想到和我一樣的辦法:
第一種:
1修改數據庫編碼方式 2 在每個jsp 頁面修改和數據庫一樣的編碼(非常蛋疼)
第二種:
1 在web.xml文件中添加過濾器 , 這個不熟悉也非常的難配置(出錯更難纏)
下面的代碼讓你不再擔心亂碼的棘手
這些說明不同編碼方式所佔的字節
gb2312,gbk 中文兩個字節,英文一個字節
在中文系統中ansi一般指gb2312或gbk
GB2312、GBK都屬於雙字節字符集 (DBCS)
Utf-8 中文三個字節,英文一個字節
Unicode 中文兩個字節,英文兩個字節
代碼如下:
public static boolean isValidUtf8(byte[] b,int aMaxCount){
int lLen=b.length,lCharCount=0;
for(int i=0;i<lLen && lCharCount<aMaxCount;++lCharCount){
byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)
if(lByte>=0) continue;//>=0 is normal ascii
if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false;
int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4
:lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;
if(i+lCount>lLen) return false;
for(int j=0;j<lCount;++j,++i) if(b[i]>=(byte)0xc0) return false;
}
return true;
}
下面是來此網上其他的解決方案
l 沒有包括對用戶默認編碼的識別,這可以根據請求信息的語言來判斷,但不一定正確,因爲我們有時候也會輸入一些韓文,或者其他文字。
l 可能會錯誤判斷UTF-8字符,一個例子是"學習"兩個字,其GBK編碼是" \xd1\xa7\xcf\xb0",如果使用上述isValidUtf8方法判斷,將返回true。可以考慮使用更嚴格的判斷方法,不過估計效果不大。
有一個例子可以證明google也遇到了上述問題,而且也採用了和上述相似的處理方法,比如,如果在地址欄中輸入"http://www.google.com/search?hl=zh-CN&newwindow=1&q=學習",google將無法正確識別,而其他漢字一般能夠正常識別。
最後,應該補充說明一下,如果不使用rewrite規則,或者通過表單提交數據,其實並不一定會遇到上述問題,因爲這時可以在提交數據時指定希望的編碼。另外,中文文件名確實會帶來問題,應該謹慎使用。
6. 其它
下面描述一些和編碼有關的其他問題。
6.1. SecureCRT
除了瀏覽器和控制檯與編碼有關外,一些客戶端也很有關係。比如在使用SecureCRT連接linux時,應該讓SecureCRT的顯示編碼(不同的session,可以有不同的編碼設置)和linux的編碼環境變量保持一致。否則看到的一些幫助信息,就可能是亂碼。
另外,mysql有自己的編碼設置,也應該保持和SecureCRT的顯示編碼一致。否則通過SecureCRT執行sql語句的時候,可能無法處理中文字符,查詢結果也會出現亂碼。
對於Utf-8文件,很多編輯器(比如記事本)會在文件開頭增加三個不可見的標誌字節,如果作爲mysql的輸入文件,則必須要去掉這三個字符。(用linux的vi保存可以去掉這三個字符)。一個有趣的現象是,在中文windows下,創建一個新txt文件,用記事本打開,輸入"連通"兩個字,保存,再打開,你會發現兩個字沒了,只留下一個小黑點。
6.2. 過濾器
如果需要統一設置編碼,則通過filter進行設置是個不錯的選擇。在filter class中,可以統一爲需要的請求或者回應設置編碼。參加上述setCharacterEncoding()。這個類apache已經給出了可以直接使用的例子SetCharacterEncodingFilter。