2012-06-30 6 views
5

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()); 
    ... 
} 
+0

Was sind Best Practices für Java SE6? (neben dem Upgrade auf SE7 :) – basZero

+0

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

+0

@ basZero: Apache Commons Compress funktioniert gut. Ich habe jedoch keine Out-of-the-Box-Lösung gefunden. – kriegaex

Antwort

6

OMG, ich spielte um für zwei Stunden oder so, aber nur fünf Minuten, nachdem ich endlich die Frage hier gepostet, ich in die Antwort gestoßen: Meine Zip-Datei nicht mit ISO-8859-1 codiert wurde, aber mit Cp437. So sollte der Konstruktor Anruf sein:

zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE), 
    Charset.forName("Cp437") 
); 

Jetzt funktioniert es wie ein Charme. Tut mir leid, dass ich dich sowieso belästigt habe. Ich hoffe, das hilft jemandem, der vor ähnlichen Problemen steht.

+0

Ich denke, dass Sie diese Antwort als richtig akzeptieren können, obwohl Sie es selbst geschrieben haben, in diesem Artikel: http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your- eigene Fragen / – seh