2012-04-02 84 views
7

我荏苒文件名中的文件名Unicode字符包含一些特殊字符,如PéréquationLES HOPITAUX NEUFS.xls到不同的文件夹,说温度使用zip压缩包

我能够压缩文件,但问题是文件的名称自动更改 P +¬r+¬quationLES HOPITAUX NEUFS.xls

如何在ZIP档案中支持unicode字符作为文件名?

+0

嗨看看这个中文文件名zip压缩probem http://stackoverflow.com/a/21521784/1194578 – mathi 2014-02-03 07:32:25

回答

16

这取决于您使用哪些代码创建存档。 旧的 Java压缩类不像您所需要的那么灵活。你可以使用Apache Commons Compress。在ZipOutputStream constructor

的一个大问题

ZipArchiveOutputStream ostream = ...; // Your initialization code here 
ostream.setEncoding("Cp437"); // This should handle your "special" characters 
ostream.setFallbackToUTF8(true); // For "unknown" characters! 
ostream.setUseLanguageEncodingFlag(true);        
ostream.setCreateUnicodeExtraFields(
    ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE); 

如果您使用的是Java 7然后你终于有一个Charset参数(可以是UTF-8):Michael Simons写了这个漂亮的一段代码无论如何,许多实现不理解Unicode编码,因为原始 ZIP文件格式是ASCII,并且没有Unicode的官方标准。进一步的细节见this post

+0

我正在使用ZipOutputStream类... – Maddy 2012-04-02 10:53:40

+2

在您的流上调用setEncoding(“UTF-8”)或将其作为FileOutputStream构造函数的参数提供。无论如何,不​​要忘记答案中指出的兼容性问题! – 2012-04-02 11:03:20

+0

import java.util.zip.ZipOutputStream;是我使用的软件包,它不支持setEncoding(“UTF-8”) – Maddy 2012-04-02 11:19:55

6

Zip规范(历史记录)未指定用于嵌入文件名和注释的字符编码,原始IBM PC字符编码集(通常称为IBM Code Page 437)应该是唯一的编码支持。 Jar规范同时明确指定使用UTF-8作为编码来对Jar文件中的所有文件名和注释进行编码和解码。我们的java.util.jar和java.util.zip实现严格遵循Jar规范,在处理存储在Jar/Zip文件中的文件名和注释时,使用UTF-8作为唯一编码。

后果?如果文件名包含Cp437之间不兼容的字符,那么由“传统”ZIP工具创建的ZIP文件不可用于基于java.util.jar/zip的工具,反之亦然(作为替代,工具可以简单地使用默认平台编码)和UTF-8

对于大多数欧洲人来说,你是“幸运的”:-)你只需要避免一小撮人物,比如变音人(好吧,我只是在开玩笑) ),但是对于日本人和中国人来说,大部分人物都是运气不好的。这就是为什么臭虫4244499多年来一直是排名前25的Java Bug中排名第一的原因。该错误不再在名单上:-)它已经在OpenJDK 7,b57中最终“修复”了。我仍然保持一个快照记录/工藤自己:-)

(我会使用“解决方案”比“固定”),该解决方案在JDK7 B57是一组新的ZipInputStream ZipOutStream和ZipFile的构造函数的介绍以特定的“charset”作为参数,如下所示。

的ZipFile(文件,字符集)

ZipInputStream(InputStream中,字符集)

ZipOutputStream(OutputStream的,字符集)

有了这些新的构造函数,应用程序现在可以访问这些通过使用特定编码创建的ZipInputStream或ZipFile对象创建非UTF-8 ZIP文件,或者通过新的ZipOutputStream创建以非UTF-8编码的Zip文件(os,c harset)构造函数,如果需要的话。

zip是Jar工具的简化版本,带有“-encoding”选项以支持条目名称和注释的非UTF8编码,它可以作为演示如何使用新的API(我使用过它作为一个单元测试)。如果将“-encoding”正式引入Jar工具中,我仍在与自己辩论...

+0

我正在使用java 6 :) – Maddy 2012-04-02 11:35:32