天天看點

開發中常見的中文亂碼原因

在開發中,我們常常遇到中文亂碼的問題,比如:

&浏覽器中看到的 jsp/servlet 頁面中的漢字成了 ’?’     

&浏覽器中看到的 servlet 頁面中的漢字都成了亂碼    

&jsp/servlet 頁面無法顯示 gbk 漢字。

&jsp/servlet 不能接收 form 送出的漢字。

&jsp/servlet 資料庫讀寫無法獲得正确的内容。

隐藏在這些問題後面的是各種錯誤的字元轉換和處理。解決類似的字元encoding問題,需要了解 jsp/servlet的運作過程,檢查可能出現問題的各個點。下面是一些自己運用中的一些分享:

1.在jsp中如果指定了<%@ page contenttype="text/html; charset=a"%>,那麼在該jsp中所有構造的string(不是引用),如果沒有指定編碼,那麼這些string的編碼是a的;從request得到的string如果沒有指定request的編碼的話,他是iso-8859-1的;從别的地方得到的string是使用原來初始的編碼的,比如從資料庫得到string,如果資料庫的編碼是b,那麼該string的編碼是b而不是a的,也不是系統預設的。此時,如果要輸出的string的編碼不是a,那麼,很可能顯示亂碼的,是以首先要将string正確轉化為編碼a的string,然後輸出。

2. 如果在jsp中沒有指定<%@ page contenttype="text/html; charset=a"%>,那麼相當于指定了<%@pagecontenttype="text/html; charset=iso-8859-1" %>。

3. servlet中如果執行了語句:response.setcontenttype("text/html;charset=a");説明将response的字元輸出流編碼設定為a,所有要輸出的string的編碼要轉化為a,否則會得到亂碼。servlet中從request得到的string的編碼和jsp中一樣的,但是在servlet java檔案中構造的string是使用的系統預設的編碼的。在servelt中從外部得到的string是使用原來的編碼的,比如從編碼為b的資料庫得到的資料是編碼為b的,不是a,也不是系統預設的編碼。

綜上所屬,要解決我們常見的中文亂碼問題,需要了解資料互動中jsp, servlet, 資料庫中資料的編碼定義,統一編碼格式或做适當轉換。