Jar包中文乱码问题

项目上遇用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文件中设置的。

原文地址:https://www.cnblogs.com/doit8791/p/8093306.html