2013-03-20 7 views
7

Tôi có một phương pháp mà thêm InputStream để zip như là một mục:Làm thế nào để thêm mục zip với utf-8 tên để zip

private void addToZip(InputStream is, String filename) throws Exception { 
    try { 
     ZipEntry zipEntry = new ZipEntry(filename); 
     zos.putNextEntry(zipEntry); 
     byte[] bytes = new byte[1024]; 
     int length; 
     while ((length = is.read(bytes)) >= 0) { 
      zos.write(bytes, 0, length); 
     } 
     zos.closeEntry(); 
    } finally { 
     IOUtils.closeQuietly(is); 
    } 
} 

Vấn đề xảy ra khi tên tập tin chứa một char UTF-8 như AE. .. Trong tệp zip, nó sẽ được lưu dưới dạng ????? và khi tôi giải nén nó trong ubuntu 12.10, có vẻ như: N├бstroje thay vì Nástroje.

Ví dụ này tôi sử dụng jdk6 nhưng JDK7 bây giờ tôi cũng đã cố gắng:

zos = new ZipOutputStream(fos, Charset.forName("UTF-8")); 

Nhưng không thành công.

Tôi cũng đã thử Apache Commons Zip và đặt mã hóa nhưng cũng không thành công.

Vậy làm cách nào tôi có thể thêm tệp này bằng các ký hiệu unicode trong tên tệp thành zip?

+0

Tôi đã gặp sự cố tương tự một thời gian trước đây. Tôi đã sử dụng bảng mã không phải Unicode, cụ thể cho ngôn ngữ địa phương (Cp866). Và nó hoạt động tốt. –

+0

vì vậy thay vì Nástroje tôi nên lưu mục nhập là Nastroje? Đây là lựa chọn cuối cùng ... cách bạn chuyển đổi nó? – hudi

+0

Ứng dụng đó được dự định chạy trong hệ thống Windows. Và tôi đã sử dụng mã hóa 'Cp866', để hỗ trợ các ký tự tiếng Nga trong tên tệp trong lưu trữ zip và xem chúng một cách chính xác khi tôi xem nội dung tệp nén. Va no đa hoạt động. Có bộ ký tự không phải unicode, có hỗ trợ các ký hiệu ngôn ngữ của bạn không? Hãy thử sử dụng nó, thay vì utf-8. –

Trả lời

3

dường như dòng này giải quyết vấn đề của tôi:

 zos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS); 

ai đó có thể giải thích cho tôi những gì là thế này làm gì và tại sao nó hoạt động?

+1

Trường bổ sung Unicode là phần mở rộng của định dạng zip để sử dụng các trường tùy chỉnh bổ sung trong tiêu đề nhập để lưu trữ phiên bản UTF-8 của tên tệp cùng với phiên bản mã hóa cục bộ mặc định. Lưu trữ các trình giải nén hỗ trợ tiện ích mở rộng này sẽ sử dụng tên UTF-8 từ các trường bổ sung tùy theo trường tên chuẩn. –

1

Lưu trữ zip theo mặc định sử dụng mã hóa DOS (OEM) để lưu trữ tên tệp. Triển khai Linux/unix sử dụng mã hệ thống khi giải nén. Mac OS sử dụng utf-8 theo mặc định. Vì vậy, trong trường hợp của bạn tên tập tin được lưu trữ một cách chính xác, nhưng Linux archiver không hiểu nó.

+0

nhưng khi tôi tạo zip trong linux (nhấp chuột phải và nén) nó tạo ra archvive với tên mục chứa ?? nhưng khi tôi giải nén nó có tên chính xác – hudi

+0

Chắc chắn, bởi vì nó sử dụng cùng một mã hóa. –

+0

mã hệ thống của tôi là UTF-8 và khi tôi sử dụng lưu trữ chung apache và đặt endocing thành utf-8 thì nó vẫn không hoạt động – hudi