Java 7 ma naprawić stary problem z rozpakowywaniem archiwów zip za pomocą zestawów znaków innych niż UTF-8. Można to osiągnąć za pomocą konstruktora ZipInputStream(InputStream, Charset)
. Jak na razie dobrze. Mogę rozpakować archiwum zip zawierające nazwy plików z umlautami w nich jawnie ustawiając zestaw znaków ISO-8859-1.ZipInputStream (InputStream, Charset) dekoduje nazwę pliku ZipEntry fałszywie
Ale tutaj: tutaj jest problem: Podczas iteracji nad strumieniem przy użyciu ZipInputStream.getNextEntry()
, wpisy mają nieprawidłowe znaki specjalne w ich nazwach. W moim przypadku umlaut "ü" otrzymuje brzmienie "?" charakter, co jest oczywiście błędne. Czy ktoś wie, jak to naprawić? Oczywiście ZipEntry
ignoruje Charset
swojej podstawowej ZipInputStream
. Wygląda to na kolejny błąd JDK związany z plikiem ZIP, ale może i robię coś złego.
...
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());
...
}
jakie są najlepsze praktyki dla Java SE6? (oprócz aktualizacji do SE7 :) – basZero
Dla SE6: testowałem ustawianie parametrów maszyny wirtualnej 'zip.altEncoding' lub' zip.encoding' na 'Cp437' lub' ISO-8859-1', oba nie pomogły poprawnie odczytać – basZero
@ basZero: Apache Commons Kompresuje ładnie. Nie znalazłem jednak rozwiązania "out-of-the-box". – kriegaex