【发布时间】:2014-07-10 03:02:39
【问题描述】:
我想在 Windows (7) 上使用 ZipOutputStream 压缩文件。问题是文件名(以及文件文件内容)还包含希腊字符(“ГП0000660040140521_a.txt”、Gamma 和 Pi)。我使用的压缩文件的代码:
ZipOutputStream zipOs = new ZipOutputStream(
new FileOutputStream("c:\\temp\\test.zip"), Charset.forName("cp737")
);
File sourceFile = new File("C:/Path/To/File/ГП0000660040140521_b.txt");
String entryName = sourceFile.getName().replaceAll("\\\\", "/");
ZipEntry entry = new ZipEntry(entryName);
zipOs.putNextEntry(entry);
...
...
但在最后一行(putNextEntry 调用)我得到一个IllegalArgumentException:
java.lang.IllegalArgumentException: UNMAPPABLE[1]
at java.util.zip.ZipCoder.getBytes(ZipCoder.java:95)
at java.util.zip.ZipOutputStream.writeLOC(ZipOutputStream.java:407)
at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:221)
我认为希腊语和 UTF-8 之间的字符映射一定有什么问题......压缩文件名中包含希腊字符的文件的正确方法是什么?
编辑
如果我使用“utf-8”作为字符集,可以创建压缩文件,但是压缩文件的名称是错误的:“ðôðƒ0000660040140521_a.txt”(缺少希腊字符)
【问题讨论】:
-
createZipEntry 方法有什么作用?
-
@agad:我的错!我已经更正了代码。谢谢。
-
当你说名字是“错误的”时,你究竟是如何验证这一点的?您使用哪个工具来检查 ZIP 文件,您确定该工具使用与创建文件名时相同的编码来解释文件名吗?
-
用Windows的文件资源管理器打开。您的意思是,文件名是正确的,但 Windows 资源管理器显示错误?但为什么 Windows 文件资源管理器显示原始文件的 Creek 字符正确?
-
在 Java 代码中使用 UTF-8 时无法重现该问题。我在德语 Windows (cp850) 上尝试过,创建了一个文件 όνομα_αρχείου.txt,然后从 Java 8 中压缩它。ZIP 文件中的文件名是正确的,我只在使用其他东西时遇到问题代码中的 UTF-8。所以我需要更多关于你是如何做到这一点的信息。
标签: java character-encoding zipoutputstream