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