Java亂碼解決之道

                                                                              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。

發佈了33 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章