7

我有一个将 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 字符时会?????出现N├бstroje问题Nástroje...

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

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

但没有成功。

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

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

4

2 回答 2

4

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

        zos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS);

有人可以解释一下这是在做什么以及为什么有效吗?

于 2013-03-20T12:01:16.497 回答
2

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

于 2013-03-20T10:38:22.333 回答