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 窗口仍然不能正確顯示漢字。
