作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个应用程序可以解压缩一个 zip 文件,其中包含许多具有不同名称的文件。 Zipfile 中的某些文件具有特殊字符。
到目前为止,解压缩适用于所有使用 API 23 及更低版本的设备。
使用 API 24 和 API 25 可以解压一些文件,但在解压特定文件(名称)时出现 Zip 格式错误错误 -> battle of chÔteau_thierry (1814).jpa(有一个特殊的字符 Ô in它)
如何在不操作 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 会隐式转换文件名。 (battle of 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)
最佳答案
我现在很高兴地解决了它,我希望我也能帮助投票者?
有关 ZipFile 的 API 已从 Nougat 更改。从 24 开始,您可以在构造 ZipFile 时指定一个 CharSet :
ZipFile(String name, Charset charset) // Charset only when >=24
在 Docu 中它说:
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();
}
}
关于android - 从 API24 向上解压缩文件名中包含特殊字符的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41908761/
我是一名优秀的程序员,十分优秀!