2015-07-19 59 views
1

我们的团队有一个程序可以生成用Java编写的PDF。可以使用非ASCII文件名的PDF使用Apache Commons Compress进行压缩。然后将zip文件上传到S3,由Windows和Mac客户端下载。如何创建具有非ASCII文件名的Windows本机兼容Zip文件

当使用本机工具在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使用?

+0

是的,这是UTF8,和什么版本的Windows?并非所有的窗口都使用UTF8进行文件名编码。 – ydobonebi

+0

Windows 7中,文件名是utf-8编码,mac可以正确显示,但windows不能,我应该为Windows生成一个不同版本的文件名,或者有一些方法可以将关于编码的自描述元数据添加到文件名这样平台可以据此推断? – tao

+0

如何生成在文件名中使用的utf非ascii字符? – ydobonebi

回答

1

根据Apache的百科全书压缩页面:(https://commons.apache.org/proper/commons-compress/zip.html

Windows的‘压缩文件夹’功能不承认任何标志或额外的领域,并创建使用平台的默认编码档案 - 并期望档案是在阅读时使用该编码。

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

因此:

如果你知道你的Windows用户都设在地球和您的文件名的有限区域仅限于该地区(例如,所有拉丁),你可以听从Apache的意见和定义用于文件名编码的8位代码页,这将被OS X的解压缩所支持。但是,这意味着它不适用于不同地区的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使用UTF-16,在它的底层API,它的Java调用。但是,Windows控制台非常破碎,并且不能很快支持UTF-8。

(Java也使用UTF-16在内部为字符串对象)

OS X强制UTF-8编码的文件名,所以创建文件名时的Java也应该尊重一点。

相关问题