ZipInputStream(InputStream中,字符集)错误地解码ZipEntry的文件名(

2019-06-25 23:01发布

Java 7中被认为与和解压缩zip档案与字符解决一个老问题比UTF-8套等。 这可以通过构造函数来实现ZipInputStream(InputStream, Charset) 。 到现在为止还挺好。 我可以解压包含文件名与他们变音符号时明确设置的ISO-8859-1字符集的zip压缩包。

这里有一个问题:当通过流使用迭代ZipInputStream.getNextEntry()条目名称中包含错误的特殊字符。 在我的情况下,变音“ü”是一个“?”代替 性格,这显然是错误的。 是否有人知道如何解决这一问题? 很明显ZipEntry忽略Charset及其底层的ZipInputStream 。 它看起来像另一个拉链有关的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());
    ...
}

Answer 1:

OMG,我周围玩了两个小时左右,但五分钟后,我终于贴出的问题在这里,我撞到了答案:我的压缩文件不是用ISO-8859-1编码,但与CP437。 因此,构造函数调用应该是:

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

现在,它就像一个魅力。 对不起,打扰你啦。 我希望这可以帮助其他人面临着类似的问题。



文章来源: ZipInputStream(InputStream, Charset) decodes ZipEntry file name falsely