【问题标题】:How to add zip entry with utf-8 name to zip如何将带有 utf-8 名称的 zip 条目添加到 zip
【发布时间】:2013-03-20 20:15:07
【问题描述】:

我有一个将 inputStream 作为条目添加到 zip 的方法:

private void addToZip(InputStream is, String filename) throws Exception {
    try {
        ZipEntry zipEntry = new ZipEntry(filename);
        zos.putNextEntry(zipEntry);
        byte[] bytes = new byte[1024];
        int length;
        while ((length = is.read(bytes)) >= 0) {
            zos.write(bytes, 0, length);
        }
        zos.closeEntry();
    } finally {
        IOUtils.closeQuietly(is);
    }
}

当文件名包含像áé这样的UTF-8字符时会出现问题...在zip文件中,它将保存为?????,当我在ubuntu 12.10中解压缩它时,它看起来像:N├бstroje而不是@987654324 @。

对于这个例子,我使用了 jdk6,但现在我也尝试了 jdk7:

zos = new ZipOutputStream(fos, Charset.forName("UTF-8"));

但没有成功。

我还尝试了 Apache Commons Zip 并设置了编码,但也没有成功。

那么我如何将这个文件名中带有 unicode 符号的文件添加到 zip 中?

【问题讨论】:

  • 前段时间我也遇到过同样的问题。我使用了特定于本地语言 (Cp866) 的非 Unicode 字符集。而且效果很好。
  • 所以我应该将条目保存为 Nastroje 而不是 Nástroje ?这是最后一个选项......你如何转换它?
  • 该应用程序旨在在 Windows 系统中运行。我使用Cp866 编码来支持 zip 档案中文件名中的俄语字符,并在我查看 zip 文件内容时正确查看它们。它奏效了。是否有支持您的语言符号的非 unicode 字符集?尝试使用它,而不是 utf-8。
  • 是:iso-8859-2 但是当我使用它时,á 正在转换为 c
  • 对不起,我不知道如何克服。

标签: java zip


【解决方案1】:

似乎这条线解决了我的问题:

        zos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS);

谁能解释一下这是在做什么以及为什么会起作用?

【讨论】:

  • Unicode 额外字段是 zip 格式的扩展,可在条目标题中使用额外的自定义字段来存储文件名的 UTF-8 版本以及默认的本地编码版本。支持此扩展的存档解包器将优先使用额外字段中的 UTF-8 名称,而不是标准名称字段。
  • 我在 ZipOutputStream 中找不到 setCreateUnicodeExtraFields 方法
  • @BogdanSamondros 这是一个 Apache Ant API ZipOutputStream
【解决方案2】:

Zip 存档默认使用 DOS(OEM) 代码页来存储文件名。 Linux/unix 实现在解包时使用系统代码页。 Mac OS 默认使用 utf-8。 因此,在您的情况下,文件名已正确存储,但 Linux 存档器不理解它。

【讨论】:

  • 但是当我在 linux 中创建 zip(右键单击并压缩)时,它会创建包含条目名称的 archvive ??但是当我提取它时,它的名称是正确的
  • 可以,因为它使用相同的编码。
  • 我的系统代码页是 UTF-8,当我使用 apache 公共存档并将 endocing 设置为 utf-8 时,它仍然不起作用
  • 最简单的检查方法是在存档中使用十六进制编辑器/查看器。 Windows zip 存档代码页取决于您的语言环境,对于俄语,它是 CP-866,对于其他语言,它应该类似于 CP-8xx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多