我正在使用ZipOutputStream来创建PDF文件的zip。
我有Map<String,byte[]>
,关键是PDF文件的名称,值是PDF文件的内容。 PDF文件名包含法语字符,例如é。
这是我的代码:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
ZipOutputStream zout = new ZipOutputStream(bufferedOutputStream);
for(Map.Entry<String, byte[]> entry : files.entrySet()) {
String fileName = entry.getKey() + ".pdf";
fileName = new String(fileName.getBytes(), utf8);
ZipEntry zip = new ZipEntry(fileName);
zout.putNextEntry(zip);
zout.write(entry.getValue());
zout.closeEntry();
}
zout.close();
zipContent = byteArrayOutputStream.toByteArray();
PDf文件名的示例:Clés
创建zip文件后,我的PDf文件的名称将变为:Cl +®s
我尝试了以下解决方案,但它们无效:
明确设置编码(我也尝试过使用windows-1252和ISO-8859-1):
final Charset utf8 = Charset.forName("UTF-8");
ZipOutputStream zout = new ZipOutputStream(bufferedOutputStream, utf8);
...
fileName = new String(fileName.getBytes(), utf8);
用unicode替换字符é:
fileName = fileName.replace("é", "\u00E9");
当我解压缩zip文件时,我使用Windows的内置提取程序(双击并全部提取)来完成。
当我用7-zip解压缩时,编码恢复正常。我看到Clés而不是Cl +®。 但是,即使没有7-zip,我也需要正确显示文件名。
我的JDK版本:8u172