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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With