How to add zip entry with utf

I have a method which adds inputStream to zip as an entry:

private void addToZip(InputStream is, String filename) throws Exception {
    try {
        ZipEntry zipEntry = new ZipEntry(filename);
        zos.putNextEntry(zipEntry);
        byte[] bytes = new byte[1024];
        int length;
        while ((length = is.read(bytes)) >= 0) {
            zos.write(bytes, 0, length);
        }
        zos.closeEntry();
    } finally {
        IOUtils.closeQuietly(is);
    }
}

The problem occurs when the filename contains an UTF-8 char like áé... In zip file it will be saved as ????? and when I unzip it in ubuntu 12.10 it looks like: N├бstroje instead of Nástroje .

For this example I used jdk6 but now I've also tried jdk7:

zos = new ZipOutputStream(fos, Charset.forName("UTF-8"));

But with no success.

I also tried Apache Commons Zip and set encoding but also with no success.

So how I can add this file with unicode symbols in filename to zip ?


seems this line solved my problem:

        zos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS);

can someone explain me what is this doing and why it works ?


Zip archive by default uses DOS(OEM) codepage to store filenames. Linux/unix implementations uses system codepage when unpacking. Mac OS uses utf-8 by default. So in your case filename is stored correctly, but Linux archiver doesn't understand it.

链接地址: http://www.djcxy.com/p/70196.html

上一篇: 如何使用Log4Net实用程序使用c#登录到数据库

下一篇: 如何使用utf添加zip条目