中文編碼集用的比較多的一般是 GBK 和 GB2312 , GBK 是 GB2312 的擴展集。國際上通用的字符集有 unicode 、 UTF-8 、 iso8859_1 等,這幾個字符集使用都非常廣泛,比如 java 內(nèi)部使用的是 unicode 字符集,幾乎所有的數(shù)據(jù)庫和 web 容器內(nèi)部默認編碼都是 iso8859_1 ,瀏覽器用 UTF-8 傳遞頁面參數(shù)。
由于中文字符集和國際標(biāo)準(zhǔn)字符集的不同,所以我們在項目開發(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ā)中至關(guān)重要,用編輯器編寫 .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
文件中是否設(shè)置有文件編碼格式,如果
JSP
文件中沒有設(shè)置編碼格式,則
JSP
編譯器調(diào)用
JDK
先把
JSP
文件用
JVM
默認的字符編碼格式
(
也即
WEB
容器所在的操作系統(tǒng)的默認的
file.encoding)
轉(zhuǎn)化為臨時的
Servlet
類,然后再把它編譯成
UNICODE
格式的
class
類,并保存在臨時文件夾中。如果
jsp
文件中設(shè)置了編碼格式,
jvm
會用該編碼格式來編譯JSP文件.所以當(dāng)你的jsp文件中沒有設(shè)置編碼格式時,在中文操作系統(tǒng)上是沒有問題的,而在e文操作系統(tǒng)部署中就會出現(xiàn)亂碼。