如何添加带有utf-8名称的zip条目到zip

时间:2013-03-20 09:19:09

标签: java zip

我有一个方法可以将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而不是Nástroje

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

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

但没有成功。

我也试过Apache Commons Zip并设置编码但也没有成功。

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

2 个答案:

答案 0 :(得分:3)

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

        zos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS);

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

答案 1 :(得分:1)

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