当前位置: 首页 > 面试题库 >

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

黎奇略
2023-03-14
问题内容

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

但这
是问题所在:使用遍历流时ZipInputStream.getNextEntry(),条目名称中的特殊字符有误。在我的情况下,变音符“ü”被替换为“?”
性格,这显然是错误的。有人知道如何解决此问题吗?显然ZipEntry忽略了Charhtml" target="_blank">set其基础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());
    ...
}

问题答案:

天哪,我玩了大约两个小时,但在我最终在此处发布问题后仅五分钟,我碰到了答案:我的zip文件不是使用ISO-8859-1编码的,而是使用Cp437编码的。因此,构造函数调用应为:

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

现在,它就像一种魅力。抱歉打扰您了。我希望这可以帮助其他面临类似问题的人。



 类似资料:
  • 描述 (Description) java.util.zip.ZipFile.getInputStream(ZipEntry entry)方法返回一个输入流,用于读取指定zip文件条目的内容。 声明 (Declaration) 以下是java.util.zip.ZipFile.getInputStream(ZipEntry entry)方法的声明。 public InputStream getIn

  • 问题内容: 我有将ZipInputSream转换为byte []的代码,但我不知道如何将其转换为inputstream。 问题答案: 这是我解决此问题的方法。现在,我可以将单个文件从ZipInputStream作为InputStream传输到内存。

  • 我在Windows 7上用俄语运行默认配置的gVim 8.2(因此所有系统文本和菜单项都是俄语)。当我打开包含俄语文本的utf8文件时,由于某种原因,它在cp1251中显示不正确: 手动设置:set encoding=utf8将其修复。 其他与编码相关的选项具有以下值: 我发现vim在这里有助于混淆,因为它似乎无法解释它是如何猜测编码的。出于某种原因,我尝试的其他应用程序(Notepad、Subl

  • 问题内容: 我正在从另一个来源接收ZipInputStream,并且需要将第一项的InputStream提供给另一个来源。 我希望能够在不将临时文件保存在设备上的情况下执行此操作,但是,我知道获取单个条目的InputStream的唯一方法是通过ZipFile.getInputStream(entry),并且因为我有一个ZipInputStream而不是ZipFile , 这是不可能的。 所以我最好

  • 问题内容: 我正在尝试编写一个函数,该函数接受带压缩文件的数据,并返回另一个带解压缩数据的数据。 压缩文件将只包含一个文件,因此不需要创建目录等。 我试着看了看其他人,但是我对Java中这么多不同类型的流感到困惑。 问题答案: 概念 GZIPInputStream用于压缩为gzip(扩展名为“ .gz”)的流(或文件)。它没有任何标题信息。 此类实现流过滤器,以读取GZIP文件格式的压缩数据 如果

  • 介绍 (Introduction) java.util.zip.ZipInputStream类实现了一个输入流过滤器,用于读取ZIP文件格式的文件。 包括对压缩和未压缩条目的支持。 类声明 以下是java.util.zip.ZipInputStream类的声明 - public class ZipInputStream extends InflaterInputStream 字段 (Fie