java - Dårlig filnavn kodning med ZipOutputStream

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger ZipOutputStream til at oprette en zip af PDF-filer.
Jeg har en Map<String,byte[]>, nøglen er navnet på PDF-filen, værdien er indholdet af PDF-filen. PDF-filnavnet indeholder franske tegn som é.


Her er min kode:


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();


Et eksempel på PDf filnavnet: Clés


Når zip-filen er oprettet, bliver navnet på min PDf-fil dette: Cl + ®s


Jeg forsøgte følgende løsninger, og de arbejdede ikke:


Angiver eksplicit kodningen (jeg prøvede også med windows-1252 og ISO-8859-1):


final Charset utf8 = Charset.forName("UTF-8");
ZipOutputStream zout = new ZipOutputStream(bufferedOutputStream, utf8);
...
fileName = new String(fileName.getBytes(), utf8);


Udskiftning af tegnet é med unicode:


fileName = fileName.replace("é", "u00E9");


Når jeg pakker ud zip-filen, gjorde jeg det med det indbyggede ekstraktionsprogram i Windows (dobbeltklik og ekstraher alt).


Når jeg pakker ud med 7-zip, er kodningen tilbage til normal. Jeg ser Clés i stedet for Cl + ®.
Jeg har dog brug for filnavnet til at blive vist korrekt, selv uden 7-zip.


Min JDK version: 8u172

Bedste reference