Java 7 soll ein altes Problem beim Entpacken von Zip-Archiven mit anderen Zeichensätzen als UTF-8 beheben. Dies kann durch Konstruktor ZipInputStream(InputStream, Charset)
erreicht werden. So weit, ist es gut. Ich kann ein Zip-Archiv entpacken, das Dateinamen mit Umlauten enthält, wenn Sie explizit einen ISO-8859-1-Zeichensatz festlegen.ZipInputStream (InputStream, Charset) dekodiert ZipEntry-Dateinamen falsch
Aber Hier ist das Problem: Bei der Iteration über den Stream mit ZipInputStream.getNextEntry()
haben die Einträge falsche Sonderzeichen in ihren Namen. In meinem Fall wird der Umlaut "ü" durch ein "?" Charakter, der offensichtlich falsch ist. Weiß jemand, wie man das repariert? Offensichtlich ignoriert ZipEntry
die Charset
des zugrunde liegenden ZipInputStream
. Es sieht aus wie ein weiterer zip-bezogener JDK-Bug, aber ich könnte auch etwas falsch machen.
...
zipStream = new ZipInputStream(
new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE),
Charset.forName("ISO-8859-1")
);
while ((zipEntry = zipStream.getNextEntry()) != null) {
// wrong name here, something like "M?nchen" instead of "München"
System.out.println(zipEntry.getName());
...
}
Was sind Best Practices für Java SE6? (neben dem Upgrade auf SE7 :) – basZero
Für SE6: Ich habe versucht, die VM-Parameter 'zip.altEncoding' oder' zip.encoding' auf 'Cp437' oder' ISO-8859-1' einzustellen, beide haben nicht geholfen, richtig zu lesen – basZero
@ basZero: Apache Commons Compress funktioniert gut. Ich habe jedoch keine Out-of-the-Box-Lösung gefunden. – kriegaex