gì là cách tốt nhất để thêm phi ASCII tên tập tin vào một tập tin zip sử dụng Java, trong một cách mà các tập tin có thể được đúng đọc cả hai Windows và Linux?Thêm tên file không ASCII để zip trong Java
Đây là một lần thử, được điều chỉnh từ https://truezip.dev.java.net/tutorial-6.html#Example, hoạt động trong Windows Vista nhưng không hoạt động trong Ubuntu Hardy. Trong Hardy tên tệp được hiển thị dưới dạng abc-ЖДФ.txt trong tệp-con lăn.
import java.io.IOException;
import java.io.PrintStream;
import de.schlichtherle.io.File;
import de.schlichtherle.io.FileOutputStream;
public class Main {
public static void main(final String[] args) throws IOException {
try {
PrintStream ps = new PrintStream(new FileOutputStream(
"outer.zip/abc-åäö.txt"));
try {
ps.println("The characters åäö works here though.");
} finally {
ps.close();
}
} finally {
File.umount();
}
}
}
Không giống như java.util.zip, truezip cho phép chỉ định mã hóa tệp zip. Đây là một mẫu khác, lần này xác định rõ ràng mã hóa. Cả IBM437, UTF-8 lẫn ISO-8859-1 đều không hoạt động trong Linux. IBM437 hoạt động trong Windows.
import java.io.IOException;
import de.schlichtherle.io.FileOutputStream;
import de.schlichtherle.util.zip.ZipEntry;
import de.schlichtherle.util.zip.ZipOutputStream;
public class Main {
public static void main(final String[] args) throws IOException {
for (String encoding : new String[] { "IBM437", "UTF-8", "ISO-8859-1" }) {
ZipOutputStream zipOutput = new ZipOutputStream(
new FileOutputStream(encoding + "-example.zip"), encoding);
ZipEntry entry = new ZipEntry("abc-åäö.txt");
zipOutput.putNextEntry(entry);
zipOutput.closeEntry();
zipOutput.close();
}
}
}
truezip với UTF-8 làm việc cho tôi trên windows 7 và mac os x 10.6.x. Nó vẫn không hoạt động trong Linux? –
Đã có một lỗi lâu đời - 9 năm tồn tại - trong JDK trước phiên bản 7 đã ngăn cản việc xử lý đúng tên tệp với các tên không thể mã hóa bằng CP437 của IBM. http://bugs.sun.com/bugdatabase/view_bug.do?bug%5Fid=4244499 Nó rõ ràng đã được sửa trong JDK7. https://blogs.oracle.com/xuemingshen/entry/non_utf_8_encoding_in Vì vậy, một giải pháp có vẻ là, sử dụng JDK7 và các nhà xây dựng mới cho ZipInputStream, ZipOutputStream và ZipFile. – Cheeso