Java:从Zip文件中读取包含特殊字符的文件

3

我有一个包含以下内容的 zip 文件:

enter image description here

Temperature_°C.log 文件中的内容: 单位°C

我使用以下代码打印 zip 文件中的所有文件名:

public static void main(String[] args) {
        try {
            ZipFile zipFile = new ZipFile("Test.zip", Charset.forName("UTF-8"));

            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                try {
                    ZipEntry zipEntry = entries.nextElement();
                    System.out.println(zipEntry.getName());

                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                }
            }
            zipFile.close();
        } catch (IOException ex) {
            Logger.getLogger(ZipTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

在代码的第ZipEntry zipEntry = entries.nextElement();行,针对Temperature_°C.log文件,它会抛出java.lang.IllegalArgumentException: MALFORMED异常。

我尝试了UTF-8编码,但无效。当我使用ISO-8859-1编码时,显示乱码字符。

我该如何解决这个问题?


显示的乱码字符 ø带斜线的拉丁小写字母 O 吗?这是使用 cp437(或在创建 zip 文件的计算机上的 OEM 代码页)产生的乱码。 - JosefZ
@JosefZ 当我使用Commons-compress时,我得到了Temperature_øC.log,但在普通Java中我得到一个方块。 - user3164187
1个回答

1

我遇到了同样的问题,但是是涉及到西里尔字母。必须使用commons-compress库,而非标准库。

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;


public static void main(String[] args) {
    try(ZipFile zipFile = new ZipFile("Test.zip")) { //UTF-8 by default
        Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
        while (entries.hasMoreElements()) {
            try {
                ZipArchiveEntry zipEntry = entries.nextElement();
                System.out.println(zipEntry.getName());
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
        }
    } catch (IOException ex) {
        Logger.getLogger(ZipTest.class.getName()).log(Level.SEVERE, null, ex);
    }
}

谢谢!使用压缩功能,我得到了以下结果:“ISO-8859-1”格式的文件名为“Temperature_øC.log”,而“UTF-8”格式的文件名为“Temperature_?C.log”。编码有误吗? - user3164187
嗯...尝试使用Total Commander创建存档,使用Zip打包程序设置"Pack Unicode names"="All as UTF-8 if at least one contains characters>127"(因为度符号是176),它可以与commons-compress和std一起工作! - Михаил Нафталь

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接