posts - 36, comments - 419, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JAVA 不同區域服務器引起的亂碼解決。

          Posted on 2009-10-24 23:03 BearRui(AK-47) 閱讀(3040) 評論(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:以上屬于個人理解,個人水平有限,如說的有問題,還請大蝦們指點。



          [作者]:BearRui(AK-47)
          [博客]: http://www.aygfsteel.com/bearrui/
          [聲明]:本博所有文章版權歸作者所有(除特殊說明以外),轉載請注明出處.
          英雄,別走啊,幫哥評論下:  

          精彩推薦 好文要頂 水平一般 看不懂 還需努力

          評論

          # re: JAVA 不同區域服務器引起的亂碼解決。  回復  更多評論   

          2009-10-26 11:40 by 淘寶網首頁
          是采用了默認的字符集,但這里的默認字符集確實Cp1252,因字符集不一致,所以就會亂碼

          # re: JAVA 不同區域服務器引起的亂碼解決。  回復  更多評論   

          2009-10-29 09:54 by admin
          一個tomcat上部署一個項目還好,如果多個項目,一個是法語的,一個中文的,如何解決

          # re: JAVA 不同區域服務器引起的亂碼解決。[未登錄]  回復  更多評論   

          2009-10-29 10:17 by lazy
          不知道事先采用utf8會不會避免這個問題

          # re: JAVA 不同區域服務器引起的亂碼解決。  回復  更多評論   

          2009-10-30 23:27 by BearRui(AK-47)
          @admin

          這種情況只能試試這個方法:

          在項目中建1個listener,在應用啟動的時候,設置一個下面的代碼:
          設置

          System.setProperty("file.encoding", "你想要的編碼");

          這個就可以不同的項目設置不同的file.encoding了。

          # re: JAVA 不同區域服務器引起的亂碼解決。  回復  更多評論   

          2009-10-30 23:27 by BearRui(AK-47)
          @lazy
          如果你的服務器本來就是UTF-8的話就可以。
          主站蜘蛛池模板: 五大连池市| 神池县| 南郑县| 北京市| 洪湖市| 绵阳市| 合水县| 镇原县| 厦门市| 泰顺县| 宁陵县| 东阿县| 荆门市| 日照市| 南乐县| 绍兴市| 静乐县| 定西市| 四川省| 建德市| 伊宁市| 额敏县| 襄樊市| 西藏| 翁源县| 锡林浩特市| 江陵县| 托克逊县| 兴仁县| 葫芦岛市| 汾阳市| 竹山县| 潼关县| 清河县| 南平市| 宁化县| 峡江县| 开化县| 五莲县| 泰州市| 寿光市|