解压使用 WinZIP 创建的具有 I18N 文件名的文件吗?
如今,人们使用 WinZIP 创建 ZIP 存档,它允许国际化(即非拉丁语:西里尔字母、希腊语、中文,凡是你能想到的)文件名。
遗憾的是,尝试解压此类文件会导致麻烦: UNIX unzip 会创建垃圾命名的文件和目录,例如“®£¤ ©¤¥èì”。 Java 及其 jar 命令在此类档案上严重失败。
有没有一种可行的方法以编程方式解压此类文件? UNIX 或 Java。
People these days create their ZIP archives with WinZIP, which allows for internationalized (i.e. non-latin: cyrillic, greek, chinese, you name it) file names.
Sadly, trying to unpack such file causes trouble:
UNIX unzip creates garbage-named files and dirs like "®£¤ ©¤¥èì".
Java and its jar command fails miserably on such archives.
Is there a passable way to unpack such files programmatically? UNIX or Java.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
DotNetZip 支持 zip 文件中文件名的 unicode 和任意编码,用于读取或写入 zip。
它是一个 .NET 库。对于 Unix 使用,您需要 Mono 作为先决条件。
如果 zip 文件是由 WinZip 正确构建的,换句话说,如果它符合 来自的 zip 规范PKWare,那么在解压它时您不需要做任何特殊的工作来指定编码。根据 zip 规范,zip 文件中的文件名支持两种编码:UTF-8 和 IBM437。这些编码中的一种或另一种的使用在 zip 元数据中指定,任何 zip 库都可以检测和使用它。 DotNetZip 在读取兼容的 zip 时会自动检测到它。像这样:
有些存档程序生成的 zip 与 rt 编码“不兼容”。 WinRar 就是其中之一 - 它将创建一个 zip 文件,其中的文件名采用计算机上使用的默认编码进行编码。在上海,它将使用cp950,而在冰岛,将使用其他东西,而在里斯本,将使用其他东西。这里“不合规”的优点是 Windows 资源管理器将打开并正确显示此类 zip 中的国际化文件名。换句话说,“不合规”通常是人们想要的,因为 Windows(还?)不支持 UTF-8 zip 文件。
(这一切都与 zip 文件中使用的编码有关,而不是 zip 文件中包含的文件中使用的编码)
zip 规范不允许在 zip 元数据中指定任意文本编码。换句话说,如果您在创建 zip 时使用 cp950,那么您的提取逻辑需要“知道”在提取时使用 cp950 - zip 文件中没有任何内容携带该信息。此外,当然,您用于以编程方式提取的 zip 库必须支持任意编码。据我所知,Java的zip库没有。 DotNetZip 可以。像这样:
DotNetZip 还可以创建具有任意编码的 zip 文件 - “不兼容”zip。
DotNetZip 是免费且开源的。
DotNetZip supports unicode and arbitrary encodings for filenames within zipfiles, either for reading or writing zips.
It's a .NET library. For Unix usage, you would need Mono as a pre-requisite.
If the zipfile is correctly constructed by WinZip, in other words if it's compliant with the zip spec from PKWare, then there's no special work you need to do to specify the encoding at the time you unpack it. According to the zip spec, there are two supported encodings used for filenames in zipfiles: UTF-8 and IBM437. The use of one or the other of these encodings is specified in the zip metadata and any zip library can detect and use it. DotNetZip automatically detects it when reading a compliant zip. like this:
There are archive programs that produce zips that are "non compliant" w.r.t. encoding. WinRar is one - it will create a zip that has filenames encoded in the default encoding in use on the computer. In Shanghai it will use cp950, while in Iceland, something else, and in Lisbon, something else. The advantage to "non compliance" here is that Windows Explorer will open and correctly display i18n-ized filenames in such zips. In other words, "non compliance" is often what people want, because Windows doesn't (yet?) support UTF-8 zip files.
(This all has to do with the encoding used in the zipfile, not the encoding used in the files contained in the zip file)
The zip spec doesn't allow for the specification of an arbitrary text encoding in the zip metadata. In other words if you use cp950 when creating the zip, then your extract logic needs to "know" to use cp950 when extracting - nothing in the zip file carries that information. In addition, of course, the zip library you use to programmatically extract must support arbitrary encodings. As far as I know, Java's zip library does not. DotNetZip does. Like so:
DotNetZip can also create zip files with arbitrary encodings - "non compliant" zips.
DotNetZip is free, and open source.
我找到的解决方案:
如果提供了正确的后备字符集,Apache commons-compress 可以很好地解压缩此类档案。
The solution I've found:
Apache commons-compress can unzip such archives just fine, if supplied with correct fallback charset.