Неверное кодирование имени файла с помощью ZipOutputStream - PullRequest
0 голосов
/ 02 мая 2018

Я использую 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...