Я использую ZipOutputStream для создания ZIP-файлов PDF.
У меня есть 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);
Замена символа é на Юникод:
fileName = fileName.replace("é", "\u00E9");
Когда я распаковал zip-файл, я сделал это с помощью встроенной программы извлечения Windows (дважды щелкните и извлеките все).
Когда я распаковываю с 7-zip, кодировка возвращается к нормальной. Я вижу Clés вместо Cl + ®.
Однако мне нужно, чтобы имя файла отображалось правильно даже без 7-zip.
Моя версия JDK: 8u172