Java 如何将具有utf-8名称的zip条目添加到zip

Java 如何将具有utf-8名称的zip条目添加到zip,java,zip,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];

我有一个将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"));
但是没有成功

我还尝试了ApacheCommonsZIP和set编码,但也没有成功


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

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

这一行似乎解决了我的问题:

        zos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS);

有人能给我解释一下这是干什么的,为什么它会起作用吗?

我以前也遇到过同样的问题。我使用了非Unicode字符集,特定于本地语言(Cp866)。而且效果很好。所以我应该把参赛作品保存为纳斯特罗耶而不是纳斯特罗耶?这是最后的选择。。。如何转换?该应用程序打算在Windows系统中运行。我使用了
Cp866
编码,以支持zip文件中文件名中的俄语字符,并在查看zip文件内容时正确查看它们。它成功了。是否有支持您的语言符号的非unicode字符集?尝试使用它,而不是utf-8。是的:iso-8859-2,但当我使用它时,它正在转换为cI,很抱歉,但我不知道如何克服它。但当我在linux中创建zip(右键单击并压缩)时,它会创建条目名为包含的archvive??但是当我提取它时,它有正确的名称,因为它使用相同的编码。我的系统代码页是UTF-8,当我使用apache common archive并将endocing设置为UTF-8时,它仍然不起作用。最简单的检查方法是在存档上使用hex editor/viewer。Windows zip存档代码页取决于您的区域设置,对于俄语,它是CP-866,对于其他语言,它应该类似于CP-8XUNICODE。额外字段是zip格式的扩展,用于在条目标题中使用其他自定义字段来存储文件名的UTF-8版本以及默认的本地编码版本。支持此扩展的归档解包程序将优先使用额外字段中的UTF-8名称,而不是标准名称字段。