中文編碼集用的比較多的一般是 GBK 和 GB2312 , GBK 是 GB2312 的擴展集。國際上通用的字符集有 unicode 、 UTF-8 、 iso8859_1 等,這幾個字符集使用都非常廣泛,比如 java 內部使用的是 unicode 字符集,幾乎所有的數據庫和 web 容器內部默認編碼都是 iso8859_1 ,瀏覽器用 UTF-8 傳遞頁面參數。
由于中文字符集和國際標準字符集的不同,所以我們在項目開發中必然面臨到編碼轉換的問題,在 j2ee 開發中尤其如此, java 是一個國際化、跨平臺的編程語言,需要部署在不同的 os 中,并且需要和跑在不同 os 上的 db 打交道,稍有不慎就會出現亂碼的問題。
下面列舉一下在日常開發時可能碰到的中文亂碼問題:
1、? 在中文 windows 系統上部署 j2ee ,訪問 jsp 頁面中文顯示正常,而移植到中文或者英文的操作系統上,訪問頁面時就出現亂碼。
2、? 頁面上靜態顯示的中文沒有亂碼問題,而從數據庫中讀出來的中文在頁面上顯示總是亂碼。
3、? 在頁面表單上填寫漢字提交后,數據庫中內容為亂碼
下面分析一下原因:
1、 中文操作系統和英文操作系統中, file.encoding 值是不一樣的,比如中文 linux 上的 file.encoding 值為 gbk, 而英文 linux 上的就不是該值。 file.encoding 在 java 開發中至關重要,用編輯器編寫 .java 文件會按照 file.encoding 指定的編碼保存, javac 編譯 .java 文件時先把文件從 file.encoding 轉換到 unicode 放入內存,然后轉換為 .class 文件。 jvm 加載類時,把 .class 以 unicode 放入內存,如果該類要接受輸入時,對于用戶的輸入, jvm 自動把內容由 file.encoding 轉碼為 unicode ,然后再送給 ,class 處理;反之,輸出內容時, jvm 完成從 unicode 到 file.encoding 的轉換。
2、對于
JSP
文件,
WEB
容器調用
JSP
編譯器,
JSP
編譯器先查看
JSP
文件中是否設置有文件編碼格式,如果
JSP
文件中沒有設置編碼格式,則
JSP
編譯器調用
JDK
先把
JSP
文件用
JVM
默認的字符編碼格式
(
也即
WEB
容器所在的操作系統的默認的
file.encoding)
轉化為臨時的
Servlet
類,然后再把它編譯成
UNICODE
格式的
class
類,并保存在臨時文件夾中。如果
jsp
文件中設置了編碼格式,
jvm
會用該編碼格式來編譯JSP文件.所以當你的jsp文件中沒有設置編碼格式時,在中文操作系統上是沒有問題的,而在e文操作系統部署中就會出現亂碼。