2012-06-30 2 views
5

Java 7은 UTF-8 이외의 문자 세트로 압축 파일을 압축 해제하면 이전 문제를 해결할 예정입니다. 이것은 생성자 ZipInputStream(InputStream, Charset)에 의해 달성 될 수있다. 여태까지는 그런대로 잘됐다. ISO-8859-1 문자 세트를 명시 적으로 설정할 때 파일 이름에 움라우트가 포함 된 zip 아카이브를 압축 해제 할 수 있습니다.ZipInputStream (InputStream, Charset)은 ZipEntry 파일 이름을 잘못 해석합니다.

여기에이 있습니다. ZipInputStream.getNextEntry()을 사용하여 스트림을 반복 할 때 항목의 이름에 잘못된 특수 문자가 있습니다. 제 경우에는 움라우트 "ü"가 "?"로 대체됩니다. 문자는 분명히 잘못되었습니다. 아무도이 문제를 해결하는 방법을 알고 있습니까? 분명히 ZipEntryCharset의 기본이되는 ZipInputStream을 무시합니다. 아직 다른 zip 관련 JDK 버그처럼 보입니다. 그러나 나는 잘못된 것도하고있을 것입니다.

... 
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

Java SE6의 모범 사례는 무엇입니까? (SE7로 업그레이드하는 것 외에도 :) – basZero

+0

SE6 : VM 매개 변수'zip.altEncoding' 또는'zip.encoding'을'Cp437' 또는'ISO-8859-1'로 설정했는데 두 가지 모두 올바르게 읽는 데 도움이되지 않았습니다. – basZero

+0

@ basZero : Apache Commons 압축은 잘 작동합니다. 나는 out-of-the-box 해결책을 찾지 못했습니다. – kriegaex

답변

6

OMG, 나는이 정도 시간 동안 놀았지만, 나는 마침내 여기에 질문을 게시 한 후 불과 5 분, 나는 대답에 부딪쳤다 : 내 zip 파일은 ISO-8859-1로 인코딩되지 않았습니다 만, Cp437. 따라서 생성자 호출은 다음과 같아야합니다.

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

이제는 매력처럼 작동합니다. 어쨌든 널 귀찮게해서 미안해. 나는 이것이 다른 사람들이 비슷한 문제에 직면하는 데 도움이되기를 바랍니다.

+0

나는 당신이이 기사에 따라 당신이 직접 쓴다고해도이 대답을 옳게 받아 들일 수 있다고 생각한다. http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your- 자신의 질문 / – seh