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

标签 java character-encoding zipinputstream

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

但是 问题是:当使用 ZipInputStream.getNextEntry() 遍历流时,条目的名称中包含错误的特殊字符。在我的例子中,变音符号“ü”被替换为“?”性格,这显然是错误的。有人知道如何解决这个问题吗?显然 ZipEntry 忽略了其底层 ZipInputStreamCharset。它看起来像是另一个与 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());
    ...
}

最佳答案

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

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

现在它就像一个魅力。

关于java - ZipInputStream(InputStream, Charset) 错误地解码 ZipEntry 文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11276343/

相关文章:

java - 有没有办法使用分段上传(Java 高级 API)使用 "java.util.zip"将提取的 zip 文件上传到 AWS-S3

Java-方法同步

javascript - 在javascript中检测浏览器字符支持?

java - 从 ZipFileInputStream 读取 UTF-8 字符串

java - 如何替换 jar 文件中某个目录中的某些文件?

character-encoding - 如何让Protege 4.3正确显示汉字?

java - 如何在java中对双数组使用indexOf方法

java - 如何通过将单个数组与流连接来实例化字符串数组流

java - JClouds:BlobStore.getBlob() 需要很长时间

python - 在 Python 中,如何从 chardet 模块开始?