java解zip文件 字符集问题

昨天部署系统到linux上,系统里有个java解压用户上传的zip包的功能。在windows上运行没有问题,可到了linux上如果zip包里包含中文名的文件传上去后文件名就是乱码。就这个问题我和我的小师傅(一个教了我不少东西的朋友 :wink: )足足搞了半宿。差点疯掉!!先前以为可能是linux是英文的缘故!!后把linux改成了中文的,可是还是不行。后来在解压那段代码上加了debug输出,打印了一下zip包里的文件名,后发现到这文件名已经是乱码了!!在 google 上找了找!发现出这样问题的还真不少总结了一下大多数的解决方法都是这样的

[quote]
[list=1]
[*]使用zip文件包内带有中文文件名文件测试,失败.后google发现java.util.zip未处理文件名编码问题已经是陈年问题。有建议说用apache 的ant.jar ver1.7中的 org.apache.tools.zip 替换java.util.zip可以解决此问题。 在命令行上测试果然成功。
[*]问题接踵而至,由于是在一个比较老的系统上(tomcat 4.1.12 and jdk1.4.0)做一个新增的小功能,在tomcat4.1.12上已经有一个ant.jar .如替换此ant.jar .会造成tomcat出现500错。而在新的Apache Tomcat 4.1.36-LE-jdk14 Server 上就没有问题。为了保持兼容性。这个新版本ant.jar(Ver1.7)是不能用了。看了一下org.apache.tools.zip的源码,只好把这个zip package摘出来,单独编译为一个package。比如叫com.mytest.common.apachezip. 然后,在tomcat 4.1.12中import这个package,不使用和tomcat的ant冲突的apache ant.jar(ver 1.7)。问题得以解决。
[/list][/quote]
我们按照上面说的方法把ant的zip package摘出来,放到自己的工程里(apache就是牛,包结构分的特好,把这个包拿出来后都不需要在引其它包)。然后把解zip包的相关类改为自己导出来的类。这样在部上发现还是不行!看样和上面出的问题不是一回事!!真想吐!!都不知道该骂谁好!!(呵呵,骂人是不对的)
最后我们在本地做了个小实验


public class Keck {

public static void main(String[] args) throws UnsupportedEncodingException {

System.out.println(new String("粥一生".getBytes(), "UTF-8"));
}
}

控制台打印出和在linux下一样的“?????”。后又换成了GBK


public class Keck {

public static void main(String[] args) throws UnsupportedEncodingException {

System.out.println(new String("粥一生".getBytes(), "GBK"));
}
}

这回打印出了正确的“粥一生”。接着我们把解压的字符集显示的设为GBK


ZipFile zipFile = new ZipFile(zipFileName, "GBK");

部署到linux上,访问O了!!这下终于明白是怎么回事了。有点爽的感觉,但还是为这事有点恶。(“跨平台相当好是java的卖点”!! 哎.....)

[size=medium][b]问题分析[/b][/size]

[list]
[*]linux默认字符集是 "UTF-8"
[*]windows默认字符集是 "GBK"
[*]
ZipFile zipFile = new ZipFile(zipFileName);

这样创建ZipFile对象的话,解压时会取本地系统的字符集生成文件名字符串。这样在windows下压的zip文件到linux下解压就会出现乱码问题。所以要像上面一样创建对像时指定字符集。
[*]但像上面那样做也不是很O!!试一下,在linux创建的zip文件在这样上传也会出乱码问题。在windows上压的zip文件要用 "GBK"解压,可在在linux上压的zip文件要用 "UTF-8" 解压,这个问题现在还没想到怎么解决,如果哪们人兄有办法希望能说说。
[/list]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值