6

Java 7 应该解决使用 UTF-8 以外的字符集解压缩 zip 档案的老问题。这可以通过构造函数来实现ZipInputStream(InputStream, Charset)。到目前为止,一切都很好。当显式设置 ISO-8859-1 字符集时,我可以解压缩包含带有变音符号的文件名的 zip 存档。

问题是:当使用 迭代流ZipInputStream.getNextEntry()时,条目的名称中有错误的特殊字符。在我的情况下,变音符号“ü”被替换为“?” 性格,这显然是错误的。有人知道如何解决这个问题吗?显然ZipEntry忽略了Charset它的底层ZipInputStream。它看起来像另一个与 zip 相关的 JDK 错误,但我也可能做错了什么。

...
zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE),
    Charset.forName("ISO-8859-1")
);
while ((zipEntry = zipStream.getNextEntry()) != null) {
    // wrong name here, something like "M?nchen" instead of "München"
    System.out.println(zipEntry.getName());
    ...
}
4

1 回答 1

9

我玩了两个小时左右,但在我最终在这里发布问题后仅仅五分钟,我就得到了答案:我的 zip 文件不是用 ISO-8859-1 编码的,而是用 Cp437 编码的。所以构造函数调用应该是:

zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE),
    Charset.forName("Cp437")
);

现在它就像一个魅力。

于 2012-06-30T18:11:03.527 回答