Posted on 2009-10-24 23:03
BearRui(AK-47) 閱讀(3031)
評(píng)論(5) 編輯 收藏 所屬分類:
Java
問(wèn)題:
項(xiàng)目在本機(jī)開(kāi)發(fā)編譯打包后發(fā)布到法國(guó)的服務(wù)器,代碼中的中文全部亂碼,就算是最簡(jiǎn)單的代碼System.out.println("中文"),打印出來(lái)的也是亂碼。
代碼在本地的服務(wù)器測(cè)試都正常。
法國(guó)服務(wù)器的環(huán)境:window 2003 中文版。
解決:
在網(wǎng)友imasmallbird的指引下,發(fā)現(xiàn)是2個(gè)服務(wù)器的file.encoding的不同,本地服務(wù)器是GBK,而法國(guó)服務(wù)器是Cp1252,所以會(huì)產(chǎn)生亂碼。
把法國(guó)服務(wù)器的區(qū)域設(shè)置改成中國(guó)后,file.encoding就變成GBK,這樣可以解決這個(gè)問(wèn)題,但因?yàn)楹芏嘣虿荒苤苯痈膮^(qū)域設(shè)置,比如改了區(qū)域設(shè)置后時(shí)間就不是法國(guó)時(shí)間。
目前解決辦法如下:
1. 本地編譯打包不用變,本地編譯采用的是GBK編譯的(默認(rèn)采用系統(tǒng)字符集編譯)
2. 在法國(guó)服務(wù)器的tomcat上加上JAVA的啟動(dòng)參數(shù) -Dfile.encoding=GBK
重啟tomcat,一切正常了。
解決了該問(wèn)題后,順便找了些JAVA的中文亂碼的資料看了下,簡(jiǎn)單的總結(jié)下:
從Java 源代碼到得到正確的結(jié)果,要經(jīng)過(guò) “Java 源代碼-> Java 字節(jié)碼-> 虛擬機(jī)->操作系統(tǒng)->顯示設(shè)備”的過(guò)程。在上述過(guò)程中的每一步驟,我們都必須正確地處理中文的編碼,才能夠使最終顯示正確的結(jié)果。
"Java 源代碼-> Java 字節(jié)碼":該階段就是調(diào)用javac 進(jìn)行編譯的階段,javac默認(rèn)采用系統(tǒng)字符集,比如我們本地機(jī)器急就是GBK,如果想用其他的編碼,比如UTF-8,可以加上 -encoding UTF-8
"Java 字節(jié)碼-> 虛擬機(jī)->操作系統(tǒng)" :該階段首先需要JRE或者JDK支持多語(yǔ)言(下載JRE的時(shí)候會(huì)讓你選擇英文版還是多語(yǔ)言版),然后就是虛擬機(jī)啟動(dòng)的時(shí)候使用什么字符集,默認(rèn)也是采用當(dāng)前系統(tǒng)的字符集,如需要修改字符集,加上JAVA的啟動(dòng)參數(shù),-Dfile.encoding=GBK
"操作系統(tǒng)->顯示設(shè)備":該階段主要就是需要操作系統(tǒng)支持顯示中文就可以,就是安裝了中文字體。
看到這里后重新看我們的亂碼問(wèn)題,我們?cè)诒镜鼐幾g(Java 源代碼-> Java 字節(jié)碼 階段)默認(rèn)采用了GBK字符集,而"Java 字節(jié)碼-> 虛擬機(jī)->操作系統(tǒng)" 階段是在法國(guó)服務(wù)器上進(jìn)行,也是采用了默認(rèn)的字符集,但這里的默認(rèn)字符集確實(shí)Cp1252,因字符集不一致,所以就會(huì)亂碼。
PS:以上屬于個(gè)人理解,個(gè)人水平有限,如說(shuō)的有問(wèn)題,還請(qǐng)大蝦們指點(diǎn)。