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());
...
}
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
Đố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
@ 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