中文編碼集用的比較多的一般是 GBK GB2312 , GBK GB2312 的擴展集。國際上通用的字符集有 unicode 、 UTF-8 、 iso8859_1 等,這幾個字符集使用都非常廣泛,比如 java 內(nèi)部使用的是 unicode 字符集,幾乎所有的數(shù)據(jù)庫和 web 容器內(nèi)部默認編碼都是 iso8859_1 ,瀏覽器用 UTF-8 傳遞頁面參數(shù)。

由于中文字符集和國際標準字符集的不同,所以我們在項目開發(fā)中必然面臨到編碼轉(zhuǎn)換的問題,在 j2ee 開發(fā)中尤其如此, java 是一個國際化、跨平臺的編程語言,需要部署在不同的 os 中,并且需要和跑在不同 os 上的 db 打交道,稍有不慎就會出現(xiàn)亂碼的問題。

下面列舉一下在日常開發(fā)時可能碰到的中文亂碼問題:

1、? 在中文 windows 系統(tǒng)上部署 j2ee ,訪問 jsp 頁面中文顯示正常,而移植到中文或者英文的操作系統(tǒng)上,訪問頁面時就出現(xiàn)亂碼。

2、? 頁面上靜態(tài)顯示的中文沒有亂碼問題,而從數(shù)據(jù)庫中讀出來的中文在頁面上顯示總是亂碼。

3、? 在頁面表單上填寫漢字提交后,數(shù)據(jù)庫中內(nèi)容為亂碼

下面分析一下原因:

1、 中文操作系統(tǒng)和英文操作系統(tǒng)中, file.encoding 值是不一樣的,比如中文 linux 上的 file.encoding 值為 gbk, 而英文 linux 上的就不是該值。 file.encoding java 開發(fā)中至關重要,用編輯器編寫 .java 文件會按照 file.encoding 指定的編碼保存, javac 編譯 .java 文件時先把文件從 file.encoding 轉(zhuǎn)換到 unicode 放入內(nèi)存,然后轉(zhuǎn)換為 .class 文件。 jvm 加載類時,把 .class unicode 放入內(nèi)存,如果該類要接受輸入時,對于用戶的輸入, jvm 自動把內(nèi)容由 file.encoding 轉(zhuǎn)碼為 unicode ,然后再送給 ,class 處理;反之,輸出內(nèi)容時, jvm 完成從 unicode file.encoding 的轉(zhuǎn)換。

2、對于 JSP 文件, WEB 容器調(diào)用 JSP 編譯器, JSP 編譯器先查看 JSP 文件中是否設置有文件編碼格式,如果 JSP 文件中沒有設置編碼格式,則 JSP 編譯器調(diào)用 JDK 先把 JSP 文件用 JVM 默認的字符編碼格式 ( 也即 WEB 容器所在的操作系統(tǒng)的默認的 file.encoding) 轉(zhuǎn)化為臨時的 Servlet 類,然后再把它編譯成 UNICODE 格式的 class 類,并保存在臨時文件夾中。如果 jsp 文件中設置了編碼格式, jvm 會用該編碼格式來編譯JSP文件.所以當你的jsp文件中沒有設置編碼格式時,在中文操作系統(tǒng)上是沒有問題的,而在e文操作系統(tǒng)部署中就會出現(xiàn)亂碼。