解決java在idea運行正常,但是打成jar包后中文亂碼問題


1.當在idea中編寫的程序,運行一切正常.但是當被打成jar包時,執行的程序會中文亂碼.產生問題的原因和解決方案是什么呢?

一.問題分析

分別使用idea和jar包形式打印出System中所有的jvm參數---代碼如下:

 public static void main(String[] args) {

        printEnv();

        //讀取excel
        ExcelUtil.simpleRead(Constant.EXCEL_PATH, AddedTax.class, 0, new AddedTaxListenner());

    }


    private static void printEnv(){
        //獲取環境變量
        Map<String, String> envs = System.getenv();
        envs.forEach( (key,value) ->{
            //System.out.println("env---key是: "+key +" ; "+"env---value是: "+ value);
        });

        //獲取jvm屬性
        Properties properties = System.getProperties();
        properties.forEach((key, value) -> {
            System.out.println("jvm---key是: "+key +" ; "+"jvm---value是: "+ value);
        });


    }

idea的打印結果:

jvm---key是: user.name ; jvm---value是: ZHULIBIN10
jvm---key是: file.encoding ; jvm---value是: UTF-8
jvm---key是: java.specification.version ; jvm---value是: 1.8
jvm---key是: java.awt.printerjob ; jvm---value是: sun.awt.windows.WPrinterJob
jvm---key是: user.timezone ; jvm---value是: Asia/Shanghai
jvm---key是: user.home ; jvm---value是: C:\Users\zhulibin10
jvm---key是: os.version ; jvm---value是: 10.0
jvm---key是: sun.management.compiler ; jvm---value是: HotSpot 64-Bit Tiered Compilers
jvm---key是: java.specification.name ; jvm---value是: Java Platform API Specification
jvm---key是: java.class.version ; jvm---value是: 52.0

jar包的打印結果:

 

 

 如上圖所示:

 問題就在這里,當使用idea時候,file.encoding的值是UTF-8; 使用jar包運行則file.encoding的值是GBK,這是導致亂碼的直接原因.

 

java 亂碼問題解決: -Dfile.encoding=UTF-8

 

-Dfile.encoding 解釋:
在命令行中輸入 java,在給出的提示中會出現 -D 的說明:
-D<name>=<value> # set a system property
-D 后面需要跟一個鍵值對,作用是設置一項系統屬性
對 -Dfile.encoding=UTF-8 來說就是設置系統屬性 file.encoding 為 UTF-8
那么 file.encoding 什么意思?字面意思為文件編碼。
搜索 java 源碼,只能找到 4 個文件中包含 file.encoding 的文件,
也就是說,只有四個文件調用了 file.encoding 這個屬性。
在 java.nio.charset 包中的 Charset.java 中,這段話的意思說的很明確了。
簡單說就是默認字符集是在 java 虛擬機啟動時決定的,
依賴於 java 虛擬機所在的操作系統的區域以及字符集。
代碼中可以看到,默認字符集就是從 file.encoding 這個屬性中獲取的。

二.問題解決總結:

 不管在任何平台,啟動jar包的方式: java -jar  -Dfile.encoding=utf-8 YourName.jar

三.解決cmd格式下輸出亂碼:

可寫一個啟動bat,將start.bat改為java -jar  -Dfile.encoding=utf-8 YourName.jar,問題就可以輕松解決。

如果還未解決,請修改cmd程序的編碼注冊表信息:

對於編譯出的程序,在 cmd 和 power shell 運行時都不能正確顯示漢字。 
網上查,可以再命令窗口修改: 
1、打開CMD.exe命令行窗口 
2、通過 chcp命令改變代碼頁,UTF-8的代碼頁為65001 
chcp 65001 
執行該操作后,代碼頁就被變成UTF-8了。

在當前窗口的確可以解決問題,但是重新打開的cmd窗口或者power shell 窗口仍然不能正確顯示漢字。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM