使用ZipOutputStream进行错误的文件名编码

时间:2018-05-02 09:09:14

标签: java windows character-encoding

我正在使用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

0 个答案:

没有答案