ZipInputStream(InputStream,Charset)错误地解码ZipEntry文件名

kri*_*aex 5 java character-encoding zipinputstream

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());
    ...
}
Run Code Online (Sandbox Code Playgroud)

kri*_*aex 8

天啊,我玩了大约两个小时左右,但在我最终在这里发布问题后的五分钟,我碰到了答案:我的zip文件没有用ISO-8859-1编码,而是用Cp437编码.所以构造函数调用应该是:

zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE),
    Charset.forName("Cp437")
);
Run Code Online (Sandbox Code Playgroud)

现在它就像一个魅力.很抱歉打扰你.我希望这有助于其他人面临类似的问题.