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)鍵在于,寫(xiě)與讀時(shí),編碼方式要一致。
?
--------------------------------------------------------------------------------------------------------------
JSP亂碼:
測(cè)試jsp頁(yè)面:
用EditPlus書(shū)寫(xiě)jsp頁(yè)面encoding.jsp
java" contentType="text/html; charset=GB2312"
??? pageEncoding="UTF-8"%>]]>
測(cè)試頁(yè)面
歡迎您!
然后保存到tomcat的Root目錄下文件中,注意:選擇編碼方式為UTF-8
游覽此頁(yè)面,可以看到頁(yè)面正常無(wú)亂碼:
將:
java" contentType="text/html; charset=GB2312" pageEncoding="UTF-8"%>]]>
替換為:
java" contentType="text/html; charset=GB2312" pageEncoding="GBK"%>]]>
再次游覽此頁(yè)面,頁(yè)面出現(xiàn)亂碼:
?
原理:
]]>
在這行的頁(yè)面指令中的"text/html; charset=UTF-8"將應(yīng)答消息中的"Content-type" 設(shè)置為"text/html; charset=UTF-8"。
"pageEncoding"只是指明了 JSP 頁(yè)面本身的編碼格式,指明了 JSP 是以什么編碼方式保存。容器在讀取文件時(shí)將起轉(zhuǎn)化為內(nèi)部使用的 Unicode. 當(dāng)應(yīng)答發(fā)送回至瀏覽器時(shí),容器會(huì)將內(nèi)部使用的 Unicode 轉(zhuǎn)化為在 Content-type 中指定的字符集。
如果沒(méi)有指定 PageEncoding,可以通過(guò)使用 Content-type 指定的字符集來(lái)解釋 JSP 頁(yè)面字節(jié)。
?
jsp頁(yè)面在服務(wù)器端處理的過(guò)程是:
jsp—>.java文件—> .class文件
jsp—> .java文件是由服務(wù)器讀取jsp頁(yè)面文件,根據(jù)pageEncoding指明的編碼方式自動(dòng)轉(zhuǎn)換的。與前面java亂碼一節(jié)中指出的,這里也要保證寫(xiě)與讀時(shí)編碼一致才不會(huì)出現(xiàn)亂碼。從上面的例子也驗(yàn)證了這一點(diǎn)。
.java文件 --> .calss文件過(guò)程,即為java編譯過(guò)程,由服務(wù)器邊jvm自動(dòng)進(jìn)行。
?
至于,text/html; charset=GB2312,則可以設(shè)置成任何游覽器支持的并且支持中文的編碼方式,都能保證頁(yè)面不出現(xiàn)亂碼。(表單提交及URL請(qǐng)求不在此討論范圍內(nèi)),這是因?yàn)椋谏身憫?yīng)給游覽器前,虛擬機(jī)中以u(píng)nicode編碼的中文是正確的,服務(wù)器會(huì)更據(jù)指定的charset,將unicode轉(zhuǎn)換成正確的編碼。
?
參考文章:
Java 編程技術(shù)中漢字問(wèn)題的分析及解決
JSP/Servlet 中的漢字編碼問(wèn)題
編碼字符集與Java -Java World亂碼問(wèn)題根源之所在
UTF-8 字符處理在 Web 開(kāi)發(fā)中的應(yīng)用
?
Technorati 標(biāo)簽:
java jsp 亂碼