2012-06-30 6 views
5

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

jakie są najlepsze praktyki dla Java SE6? (oprócz aktualizacji do SE7 :) – basZero

+0

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

+0

@ basZero: Apache Commons Kompresuje ładnie. Nie znalazłem jednak rozwiązania "out-of-the-box". – kriegaex

Odpowiedz

6

OMG, grałem około dwóch lub więcej godzin, ale tylko pięć minut po tym, jak w końcu napisali pytanie tutaj, wpadłem na odpowiedź: Mój plik zip nie został zakodowany z ISO-8859-1, ale z Cp437. Tak więc wywołanie konstruktora powinno być:

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

Teraz działa jak urok. Przepraszam, że i tak przeszkadzam. Mam nadzieję, że pomoże to komuś, kto ma podobne problemy.

+0

Myślę, że możesz przyjąć tę odpowiedź jako poprawną, nawet jeśli sam ją napisałeś, za ten artykuł: http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your- własne pytania / – seh

Powiązane problemy