渣一般的zip

  最近有教师报告在eLearning上批量下载学生作业后,所下载的zip文件无法解压,或乱码。排查后发现原因出在zip文件格式上。zip文件本身并没有任何元信息来说明采用何种编码进行文件名编码。而JDK自带的ZipOutputStream使用的似乎是Latin1,于是所有的中文文件名全部中招。
  网上查了一下相关解决方案,有提议直接修改ZipOutputStream类的(源代码复制出来,再修改),个人认为这是一个很渣的解决方案,万一以后JDK相关类库升级的话,还要修改相关代码。另外有人说使用其他类库代替,这个方法是比较靠谱的。先后试了Ant包,以及commons-compress包。前者的好处是类名也是ZipOutputStream,只要修改Import部分的内容就可以了。但在实际操作中,发现压缩出来的东西并不理想。而commons的包还是经得起考验的,除了类名和方法有些变化,需要在原来的代码中进行修改外,其他没有遇到什么问题。
  接下来让我郁闷的就是zip那恶心的编码问题了,当然顺带问候一下Windows。当使用UTF-8编码进行压缩时,Linux和Mac OS可以正常解压,Windows下自带解压缩工具解压乱码、WinRAR解压乱码、7zip解压正常(还是开源的守规矩啊);使用GB18030编码压缩时,Linux和Mac OS乱码,Windows正常,WinRAR正常。于是,问题来了,到底怎么解决这个问题,郁闷得我都想直接改成tar了。
  最终决定还是使用UTF-8编码,这样可以保证所有平台下都有正常解决方案。但由此也了解到了此前从来没有考虑到的zip编码问题,也所学到了。

About 高 珺

海似地铺