【问题标题】:File names with Japanese characters turn to garbage when written to a zip file using java.util.zip.*使用 java.util.zip 写入 zip 文件时,带有日语字符的文件名会变成垃圾。*
【发布时间】:2010-12-30 23:12:14
【问题描述】:

我有一个名称包含日文字符的目录,我需要使用 java.util.zip 中的 zip 实用程序将其写入 zip 文件。编写 zip 文件成功,但是当我使用 Windows 的内置压缩文件实用程序或 7-Zip 打开生成的 zip 文件时,名称中带有日文字符的目录显示为一堆垃圾字符。我的系统上确实安装了日语/东亚语言包——我可以使用日语名称创建目录,所以这不是问题。

有趣的是,如果我编写一个单独的脚本来使用 java.util.zip 读取生成的 zip 文件,目录名称是正确的,我可以将 zip 的内容提取到适当命名的目录中,并使用日文字符。但是我无法使用我尝试过的商业 zip 工具来做到这一点,这无疑是我们的客户想要做的。

关于导致此问题的原因以及如何解决此问题的任何想法?

我知道this bug,但我仍然需要解决这种情况。

【问题讨论】:

  • 好问题。如果您可以使用脚本提取它并在最后获得正确的文件名,这意味着这些字符正在以支持这些字符的编码进行编码,例如 Shift-JIS 或 UTF-8。
  • 它们绝对是 UTF-8 或 Java 的版本。见此链接:velocityreviews.com/forums/…

标签: java unicode zip internationalization localization


【解决方案1】:

奇迹确实发生了,Sun/Oracle 确实修复了长期存在的错误/rfe:

现在可以[在创建时设置文件名编码][1] zip 文件/流(需要 Java 7)。

[1]:http://download.java.net/jdk7/docs/api/java/util/zip/ZipOutputStream.html#ZipOutputStream(java.io.OutputStream,java.nio.charset.Charset)

【讨论】:

  • 哇,好消息。我们的客户需要一段时间才能从中受益,但我很高兴这不仅仅是一个溃烂的疮。
【解决方案2】:

TrueZIP claims to do this better:

J2SE API 始终使用 UTF-8(八 位 Unicode 字符集)用于条目 名称和 cmets 而不是 CP437 (又名 IBM437,真正的 IBM-PC 字符集),由 来自 PKWARE 的事实上的标准 PKZIP。 因此,您无法读取或写入 具有国际条目的 ZIP 文件 文件名,例如“täscht.txt” 在由 (southern) 创建的 ZIP 文件中 德语。

[省略其他问题描述]

TrueZIP 库的开发旨在克服这些限制/缺点。

【讨论】:

  • 我不知道 TrueZIP 库,但评论有点误导。 “事实上的标准”PKZIP 软件 PKWARE 的制造商发布了该格式的实际规范。 pkware.com/support/zip-application-note 该规范允许使用 CP437 或 UTF-8。如果 ZIP 应用程序符合规范,它们可以使用任一编码。因此,“您不能使用 i18n 化的条目名称读取或写入 ZIP 文件”的说法通常是不正确的。任何应用程序都可以符合规范。(也不清楚 - 我不确定在德国南部有什么关系)。
  • 话虽如此,一些应用程序和压缩工具并不完全符合规范,特别是规范的 UTF-8 部分,它于 2007 年 9 月首次添加。因此,例如,Windows Vista“压缩文件夹”将无法正确读取条目名称以 UTF-8 编码的 .ZIP 文件。不确定 Mac 的内置 zip 工具。我也不确定 J2SE api 是否符合 zip 规范的 Sept2007 修订版。尽管规范中支持 UTF-8,但 J2SE api 早于规范,并且在规范之外为 Unicode 支持做了一些事情,这可能是真的。
  • 信息量很大。恕我直言,这将保证它自己的答案(和赞成)。我认为“南部德语”部分只是包含非 ascii 字符“ä”的条目名称的轻率动机。
  • 很高兴它提供了丰富的信息。我发表评论是因为我对如何用 Java 解决问题没有任何好主意。所以你的答案仍然是最好的!
【解决方案3】:

如果 java.util.zip 的行为仍然像 this post describes,我不确定它是否可能(使用内置类)。我已经看到之前提到的Chilkat's Java Zip library 作为一种使其工作的方法,但从未使用过它。

【讨论】:

  • 只是添加...帖子说“ZIP文件格式不支持Unicode。文件名在内部只是8位字符串,(afaik)没有定义的字符集或Unicode编码。这意味着文件的作者和读者必须就相互理解的格式达成一致。”这从来都不是完全正确的。作者在 2005 年发表那篇文章时,编码是 IBM437。没有关于需要该字符集之外的内容的字符的协议。 2007 年,PKZIP 将 UTF-8 添加到规范中。正如 Kaleb 所说,尚不清楚 J2SE 是否曾经演变为支持该规范更新。我猜不会。
  • 我尝试使用 Chilkat 库,但结果比使用标准 zip 实用程序差。
猜你喜欢
  • 2013-05-29
  • 2016-10-26
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2015-06-14
相关资源
最近更新 更多