如何使用非ascii文件名创建Windows本机兼容的Zip文件



我们的团队有一个用Java编写的生成pdf的程序。pdf文件可能具有非ascii文件名,使用Apache Commons Compress进行压缩。zip文件随后被上传到S3,供Windows和Mac客户端下载。

当在Mac上使用本机工具解压缩时,文件将以正确的文件名重新创建。但是,当尝试使用本机Windows UI工具解压缩时,文件名创建不正确。

压缩过程如下:

    import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; 

和我已经添加了以下代码,它仍然不工作,在Windows上显示不可读的字符:

    zipFile.setEncoding("UTF-8");
    zipFile.setUseLanguageEncodingFlag(true);     
    zipFile.setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPoli‌​cy.ALWAYS);

如何创建Mac和Windows都可以使用的zip文件?

根据Apache Commons压缩页面:(https://commons.apache.org/proper/commons-compress/zip.html)

Windows' '压缩文件夹' ';Feature不识别任何标志或额外的字段,并使用平台默认编码创建存档-并且在读取存档时期望存档使用该编码。

如果Windows' "压缩文件夹"是您的主要消费者,那么您的最佳选择是显式地将编码设置为目标平台。您可能希望启用创建Unicode额外字段,以便支持它们的工具能够正确提取文件名。

因此:

如果你知道你的Windows用户在地球上的一个有限的区域,你的文件名被限制在那个区域(例如,所有的拉丁语),你可以听从Apache的建议,定义一个8位的代码页用于文件名编码,这将被OS X的unzip所尊重。然而,这意味着它将不能在不同地区的Windows机器上工作,或者意外地使用稍微不同的代码页(北美和西欧)。

明智的选择是在Windows上使用另一种存档工具,并可能使用另一种存档格式。也许您可以通过在zip文件前添加合适的解压工具来为Windows创建自解压归档文件。例如,您可以使用下面的粗略说明在Java中创建一个自解压的7zip归档文件:http://sourceforge.net/p/sevenzip/discussion/45798/thread/de8aa3c6

伪格式为:

7z.sfx + config.txt + your-created-archive.7z your-created-archive.exe

其中7z.sfx是一个7zip自解压的可执行头文件;随7zip分发。

对相关评论的回应:

Windows使用UTF-16作为文件名,AFAIK在Java调用的底层API中使用UTF-16。但是,Windows控制台非常糟糕,不能快速支持UTF-8。

(Java内部也使用UTF-16作为String对象)

OS X对文件名编码强制使用UTF-8,因此Java在创建文件名时也应该尊重这一点。

相关内容

  • 没有找到相关文章

最新更新