【问题标题】:Unzipping a file with special characters in filenames from API24 upward从 API24 向上解压缩文件名中包含特殊字符的文件
【发布时间】:2017-01-28 10:35:14
【问题描述】:

我有一个解压缩 zipfile 的应用程序,其中包含许多不同名称的文件。 Zipfile 中的某些文件有特殊字符。

解压缩适用于所有使用 API 23 的设备,目前为止。

使用 API 24 和 API 25,它会解压缩一些文件,但在解压缩特定文件(名称)时会出现 Zip 格式错误的错误 -> chÔteau_thierry (1814).jpa 之战(其中有一个特殊字符 Ô它)

如何在不操作 zip 的情况下解压缩带有特殊字符的文件。我的意思是它已经适用于少于 24 的 API。

有人可以帮我吗?

        ZipFile zipFile = new ZipFile(zipname);
        Enumeration enumeration = zipFile.entries();

        while (enumeration.hasMoreElements()) {

            ZipEntry zipEntry = null;
            zipEntry = (ZipEntry) enumeration.nextElement();  <----- Craches, when it comes to the file : battle of chÔteau_thierry (1814).jpa
            String sName = zipEntry.getName();
}

* 更新 *

压缩文件的链接: https://drive.google.com/file/d/0BzTzuiIaUzqkd3loR2dPdW03T28/view?usp=sharing

您必须在本地下载文件,因为 google drive 会隐式转换文件名。 (chateau_thierry 之战 (1814).jpa,法语)您只能在本地 zip 文件中看到字符 Ô。

Stacktrace,我只为 API 24 和 25 设备获取:

Hint : java.lang.IllegalArgumentException: MALFORMED[1]
at java.util.zip.ZipCoder.toString(ZipCoder.java:65)
at java.util.zip.ZipFile.getZipEntry(ZipFile.java:548)
at java.util.zip.ZipFile.-wrap2(ZipFile.java)
at java.util.zip.ZipFile$1.nextElement(ZipFile.java:530)
at java.util.zip.ZipFile$1.nextElement(ZipFile.java:508)
at solveraapps.chronicbrowser.ChronicBrowser.unzipImages(ChronicBrowser.java:8011)
at solveraapps.chronicbrowser.ChronicBrowser$16.run(ChronicBrowser.java:8442)

【问题讨论】:

  • 崩溃的 Java 堆栈跟踪是什么?您能否上传一个演示该问题的示例 ZIP 文件?
  • 非常感谢您的帮助。我刚刚参考 zipfile 和 stacktrace 更新了这个问题。还添加了一些代码,因此可以粘贴以重现。非常感谢。
  • 该 ZIP 存档中没有名为 chÔteau.jpg 的文件。
  • 我看到了问题。您必须在本地下载 zip 文件。只有这样,您才会在档案中看到一个名为“chÔteau_thierry (1814).jpa 之战”的文件。我刚刚测试过了。 Google Drive 似乎进行了隐式转换。
  • 在发表我之前的评论之前,我已经在本地下载了它。我看到一个ba/ 目录。在那里,最接近的匹配是battle of chтteau_thierry (1814).jpa。

标签: android unzip


【解决方案1】:

我很高兴现在解决了它,我希望我也可以帮助投票者?

关于 ZipFile,API 已从 Nougat 更改。从 24 开始,您可以在构造 ZipFile 时指定 CharSet :

ZipFile(String name, Charset charset) // Charset only when >=24

在文档中它说:

The UTF-8 charset is used to decode the entry names and comments

所以我的编码解决方案是将正确的字符集设置为“ISO-8859-1”:

@TargetApi(24)
public void myUnzipper(){

            ZipFile zipFile = null;
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){ // N for Nougat
                zipFile = new ZipFile(zipname,Charset.forName("ISO-8859-1"));
            }else{
                zipFile = new ZipFile(zipname);
            }

            while (enumeration.hasMoreElements()) {

                ZipEntry zipEntry = null;
                zipEntry = (ZipEntry) enumeration.nextElement();  <----- Craches, when it comes to the file : battle of chÔteau_thierry (1814).jpa
                String sName = zipEntry.getName();
            }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多