JAVA亂碼:
測試代碼:
public
class SayHello {
publicstaticvoid main(String[] args){
//System.setProperty("file.encoding", "iso8859-1");
System.out.println("您好!");
}
}
采用JVM默認file.encoding編碼編譯:(默認為GBK)
?
指定file.encoding編譯:(指定為iso8859-1)
可以看出,若不指定初始參數file.encoding=iso8859-1(采用默認的GBK),則打印出亂碼。同時,若指定的值與編譯時不一致也會是亂碼。
?
因此,解決亂碼的關鍵在于,寫與讀時,編碼方式要一致。
?
--------------------------------------------------------------------------------------------------------------
JSP亂碼:
測試jsp頁面:
用EditPlus書寫jsp頁面encoding.jsp
java" contentType="text/html; charset=GB2312"
??? pageEncoding="UTF-8"%>]]>
測試頁面
歡迎您!
然后保存到tomcat的Root目錄下文件中,注意:選擇編碼方式為UTF-8
游覽此頁面,可以看到頁面正常無亂碼:
將:
java" contentType="text/html; charset=GB2312" pageEncoding="UTF-8"%>]]>
替換為:
java" contentType="text/html; charset=GB2312" pageEncoding="GBK"%>]]>
再次游覽此頁面,頁面出現亂碼:
?
原理:
]]>
在這行的頁面指令中的"text/html; charset=UTF-8"將應答消息中的"Content-type" 設置為"text/html; charset=UTF-8"。
"pageEncoding"只是指明了 JSP 頁面本身的編碼格式,指明了 JSP 是以什么編碼方式保存。容器在讀取文件時將起轉化為內部使用的 Unicode. 當應答發送回至瀏覽器時,容器會將內部使用的 Unicode 轉化為在 Content-type 中指定的字符集。
如果沒有指定 PageEncoding,可以通過使用 Content-type 指定的字符集來解釋 JSP 頁面字節。
?
jsp頁面在服務器端處理的過程是:
jsp—>.java文件—> .class文件
jsp—> .java文件是由服務器讀取jsp頁面文件,根據pageEncoding指明的編碼方式自動轉換的。與前面java亂碼一節中指出的,這里也要保證寫與讀時編碼一致才不會出現亂碼。從上面的例子也驗證了這一點。
.java文件 --> .calss文件過程,即為java編譯過程,由服務器邊jvm自動進行。
?
至于,text/html; charset=GB2312,則可以設置成任何游覽器支持的并且支持中文的編碼方式,都能保證頁面不出現亂碼。(表單提交及URL請求不在此討論范圍內),這是因為,在生成響應給游覽器前,虛擬機中以unicode編碼的中文是正確的,服務器會更據指定的charset,將unicode轉換成正確的編碼。
?
參考文章:
Java 編程技術中漢字問題的分析及解決
JSP/Servlet 中的漢字編碼問題
編碼字符集與Java -Java World亂碼問題根源之所在
UTF-8 字符處理在 Web 開發中的應用
?
Technorati 標簽:
java jsp 亂碼