在Android中解压缩unicode文件名错误

时间:2011-07-26 20:50:19

标签: android utf-8 zip filenames

我有一个zip文件,其中包含一个文件:“Induláselőtt.html” (这是匈牙利文本)

但是当我尝试解压缩时,我在getNextEntry行中遇到错误:

try {
    ZipInputStream zis = newZipInputStream(getResources().openRawResource(R.raw.ie));
    ZipEntry ze = null;
    while ((ze = zis.getNextEntry()) != null) {
        info.setText(info.getText() + "\nName: " + ze.getName());
    }
} catch (Exception e) {
    info.setText(info.getText() + "\nERROR: " + e.getMessage());
}

并且错误消息是:“5处的输入与UTF8规范不匹配”

后来我尝试了另一种模式:

ZipFile zipfile = new ZipFile(file);
for (Enumeration e = zipfile.entries(); e.hasMoreElements();) {
    ZipEntry entry = (ZipEntry) e.nextElement();
    String name = new String(entry.getName().getBytes("UTF-8"), "UTF-8");
    info.setText(info.getText() + "\nName: " + name);
}

但显示了这个:

Image

解决方案是什么?

该文字包括以下字母:

链接#1:HTTP://en.wikipedia.org/wiki/%C3%81

链接#2:HTTP://en.wikipedia.org/wiki/%C5%90#Hungarian

1 个答案:

答案 0 :(得分:0)

zip文件的文件名字符集可能不明确。 Java 7的zip实现应该能够检测到UTF-8标志(http://docs.oracle.com/javase/7/docs/api/java/util/zip/package-summary.html#lang_encoding),但这依赖于打包应用程序正确编码文件名并设置必需的UTF-8标志。

我怀疑您的zip文件打包不正确或者没有使用UTF-8文件名。尝试传递默认的Zip字符集:Cp437

E.g。

ZipInputStream zis = new ZipInputStream(getResources().openRawResource(R.raw.ie), Charset.forName("Cp437"));