2012-06-30 20 views
5

Java 7 được coi là khắc phục sự cố cũ với việc giải nén lưu trữ zip với các bộ ký tự khác ngoài UTF-8. Điều này có thể đạt được bằng cách xây dựng ZipInputStream(InputStream, Charset). Càng xa càng tốt. Tôi có thể giải nén một kho lưu trữ zip chứa các tên tập tin với các âm sắc trong chúng khi đặt rõ ràng một bộ ký tự ISO-8859-1.ZipInputStream (InputStream, Charset) giải mã tên tệp ZipEntry sai

Nhưng đây là sự cố: Khi lặp qua luồng bằng cách sử dụng ZipInputStream.getNextEntry(), các mục nhập có ký tự đặc biệt sai trong tên của chúng. Trong trường hợp của tôi, "um" được thay thế bằng dấu "?" nhân vật, rõ ràng là sai. Có ai biết cách sửa lỗi này không? Rõ ràng là ZipEntry bỏ qua số Charset trong số ZipInputStream nằm bên dưới. Có vẻ như một lỗi JDK liên quan đến zip khác, nhưng tôi cũng có thể làm điều gì đó sai.

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

thực tiễn tốt nhất cho Java SE6 là gì? (bên cạnh việc nâng cấp lên SE7 :) – basZero

+0

Đối với SE6: Tôi đã thử cài đặt các tham số VM 'zip.altEncoding' hoặc' zip.encoding' thành 'Cp437' hoặc' ISO-8859-1', cả hai đều không giúp đọc chính xác – basZero

+0

@ basZero: Apache Commons Nén hoạt động độc đáo. Tuy nhiên, tôi không tìm thấy giải pháp out-of-the-box. – kriegaex

Trả lời

6

OMG, tôi đã chơi khoảng hai giờ hoặc lâu hơn, nhưng chỉ năm phút sau khi cuối cùng tôi đăng các câu hỏi ở đây, tôi tình cờ gặp câu trả lời: file zip của tôi không được mã hóa với tiêu chuẩn ISO-8859-1, nhưng với Cp437. Vì vậy, lệnh gọi hàm tạo phải là:

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

Bây giờ nó hoạt động như một sự quyến rũ. Xin lỗi vì đã làm phiền bạn. Tôi hy vọng điều này sẽ giúp người khác đối mặt với các vấn đề tương tự.

+0

Tôi nghĩ bạn có thể chấp nhận câu trả lời này là chính xác, mặc dù bạn đã tự viết nó, cho mỗi bài viết này: http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your- câu hỏi riêng / – seh