目錄
比如: 打包命令使用utf-8編碼:
1.當(dāng)在idea中編寫的程序,運行一切正常.但是當(dāng)被打成jar包時,執(zhí)行的程序會中文亂碼.產(chǎn)生問題的原因和解決方案是什么呢?
一.問題分析
分別使用idea和jar包形式打印出System中所有的jvm參數(shù)---代碼如下:
public static void main(String[] args) {
? ? ? ? printEnv();
? ? ? ? //讀取excel
? ? ? ? ExcelUtil.simpleRead(Constant.EXCEL_PATH, AddedTax.class, 0, new AddedTaxListenner());
? ? }
? ? private static void printEnv(){
? ? ? ? //獲取環(huán)境變量
? ? ? ? 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的打印結(jié)果:
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包的打印結(jié)果:
?如上圖所示:
?問題就在這里,當(dāng)使用idea時候,file.encoding的值是UTF-8; 使用jar包運行則file.encoding的值是GBK,這是導(dǎo)致亂碼的直接原因.
java 亂碼問題解決: -Dfile.encoding=UTF-8
?
-Dfile.encoding 解釋:
在命令行中輸入 java,在給出的提示中會出現(xiàn) -D 的說明:
-D<name>=<value> # set a system property
-D 后面需要跟一個鍵值對,作用是設(shè)置一項系統(tǒng)屬性
對 -Dfile.encoding=UTF-8 來說就是設(shè)置系統(tǒng)屬性 file.encoding 為 UTF-8
那么 file.encoding 什么意思?字面意思為文件編碼。
搜索 java 源碼,只能找到 4 個文件中包含 file.encoding 的文件,
也就是說,只有四個文件調(diào)用了 file.encoding 這個屬性。
在 java.nio.charset 包中的 Charset.java 中,這段話的意思說的很明確了。
簡單說就是默認(rèn)字符集是在 java 虛擬機(jī)啟動時決定的,
依賴于 java 虛擬機(jī)所在的操作系統(tǒng)的區(qū)域以及字符集。
代碼中可以看到,默認(rèn)字符集就是從 file.encoding 這個屬性中獲取的。
二.問題解決總結(jié):
?不管在任何平臺,啟動jar包的方式: java -jar ?-Dfile.encoding=utf-8 YourName.jar
比如: 打包命令使用utf-8編碼:
java -jar ?-Dfile.encoding=utf-8 項目包名字.jar
三.解決cmd格式下輸出亂碼:
可寫一個啟動bat,將start.bat改為java -jar ?-Dfile.encoding=utf-8 YourName.jar,問題就可以輕松解決。
如果還未解決,請修改cmd程序的編碼注冊表信息:
對于編譯出的程序,在 cmd 和 power shell 運行時都不能正確顯示漢字。?
網(wǎng)上查,可以再命令窗口修改:?
1、打開CMD.exe命令行窗口?
2、通過 chcp命令改變代碼頁,UTF-8的代碼頁為65001?
chcp 65001?
執(zhí)行該操作后,代碼頁就被變成UTF-8了。
在當(dāng)前窗口的確可以解決問題,但是重新打開的cmd窗口或者power shell 窗口仍然不能正確顯示漢字。文章來源:http://www.zghlxwxcb.cn/news/detail-445526.html
————————————————
版權(quán)聲明:本文為CSDN博主「魔都Thomas」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_42058242/article/details/114933003?文章來源地址http://www.zghlxwxcb.cn/news/detail-445526.html
到了這里,關(guān)于解決java在idea運行正常,但是打成jar包后中文亂碼問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!