項目上遇用winrar修改替換jar中一個中文文件名后出現jar包解壓讀取錯誤問題,被這個問題糾纏了兩次,都是現場比較情急的情況,於是就研究一下徹底弄清楚這個問題。中間也網上搜過一些內容,但實際測試不管用,可能遇自己電腦環境有關吧。
首先要明確jar文件本質上是在zip文件基礎上增加了一些元數據描述信息文件,而zip文件本身也沒有包含編碼信息,它使用系統默認編碼打開處理,在win系統下默認是gbk,而在linux下默認就是utf-8。
我通過java的jar命令創建打開更新jar文件時默認都是用的utf-8,並且Java本身jdk包中的JarFile類不能指定編碼只能用utf-8來處理,如果jar包不是這種格式在解析jar包中元素時就會拋出異常。在本機windows環境下,分別在eclipse(工程默認是utf-8)和命令行窗口執行class文件(系統默認編碼是GBK),發現使用ZipFile(JDK6以上可以設置編碼方式,JarFile無法設置編碼參數)讀取Jar文件在不用winrar修改前無論是用utf-8還是GBK編碼都能正常解析,然后用winRar修改其中含有中文的文件名,此時用GBK編碼方式可以正常讀取,當用UTF-8編碼讀到中文文件名時會拋異常。
另外,看到網上有說在執行jar命令或mvn package命令時增加-Dfile.encoding=utf-8來設置編碼的,親測在本機環境下不成功,首先jar命令沒有-D這樣的參數用法;mvn package的編碼是直接在pom文件中設置的。