1. 程式人生 > >正確設置-Dfile.encoding參數

正確設置-Dfile.encoding參數

什麽 ext 正常 測試 hidden 最終 sep osi gin

正確設置-Dfile.encoding參數

摘自:https://blog.csdn.net/youge/article/details/6178265

2011年02月11日 10:18:00 閱讀數:1889 標簽: java服務器虛擬機tomcat語言jdk 更多個人分類: java

正確設置-Dfile.encoding參數

問題:
項目在本機開發編譯打包後發布到法國的服務器,代碼中的中文全部亂碼,就算是最簡單的代碼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,因字符集不一致,所以就會亂碼。





System.getProperty("file.encoding
") 得到當前系統字符集
content.getBytes(System.getProperty("file.encoding")),"GBK") 通過當前字符集轉碼

正確設置-Dfile.encoding參數