JAVA亂碼:
測(cè)試代碼:
public class SayHello { publicstaticvoid main(String[] args){ //System.setProperty("file.encoding", "iso8859-1"); System.out.println("您好!"); } }
采用JVM默認(rèn)file.encoding編碼編譯:(默認(rèn)為GBK)
?
指定file.encoding編譯:(指定為iso8859-1)
可以看出,若不指定初始參數(shù)file.encoding=iso8859-1(采用默認(rèn)的GBK),則打印出亂碼。同時(shí),若指定的值與編譯時(shí)不一致也會(huì)是亂碼。
?
因此,解決亂碼的關(guān)鍵在于,寫與讀時(shí),編碼方式要一致。
?
--------------------------------------------------------------------------------------------------------------
JSP亂碼:
測(cè)試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"%>]]>
再次游覽此頁面,頁面出現(xiàn)亂碼:
?
原理:
]]>
在這行的頁面指令中的"text/html; charset=UTF-8"將應(yīng)答消息中的"Content-type" 設(shè)置為"text/html; charset=UTF-8"。
"pageEncoding"只是指明了 JSP 頁面本身的編碼格式,指明了 JSP 是以什么編碼方式保存。容器在讀取文件時(shí)將起轉(zhuǎn)化為內(nèi)部使用的 Unicode. 當(dāng)應(yīng)答發(fā)送回至瀏覽器時(shí),容器會(huì)將內(nèi)部使用的 Unicode 轉(zhuǎn)化為在 Content-type 中指定的字符集。
如果沒有指定 PageEncoding,可以通過使用 Content-type 指定的字符集來解釋 JSP 頁面字節(jié)。
?
jsp頁面在服務(wù)器端處理的過程是:
jsp—>.java文件—> .class文件
jsp—> .java文件是由服務(wù)器讀取jsp頁面文件,根據(jù)pageEncoding指明的編碼方式自動(dòng)轉(zhuǎn)換的。與前面java亂碼一節(jié)中指出的,這里也要保證寫與讀時(shí)編碼一致才不會(huì)出現(xiàn)亂碼。從上面的例子也驗(yàn)證了這一點(diǎn)。
.java文件 --> .calss文件過程,即為java編譯過程,由服務(wù)器邊jvm自動(dòng)進(jìn)行。
?
至于,text/html; charset=GB2312,則可以設(shè)置成任何游覽器支持的并且支持中文的編碼方式,都能保證頁面不出現(xiàn)亂碼。(表單提交及URL請(qǐng)求不在此討論范圍內(nèi)),這是因?yàn)椋谏身憫?yīng)給游覽器前,虛擬機(jī)中以u(píng)nicode編碼的中文是正確的,服務(wù)器會(huì)更據(jù)指定的charset,將unicode轉(zhuǎn)換成正確的編碼。
?
參考文章:
編碼字符集與Java -Java World亂碼問題根源之所在
UTF-8 字符處理在 Web 開發(fā)中的應(yīng)用
?