我想使用ZipOutputStream在
Windows(7)上压缩一个文件.问题是文件名(和文件内容)也包含希腊字符(“ГП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”作为字符集,可以创建zip文件,但压缩文件的名称是错误的:“0000660040140521_a.txt”(希腊字符丢失)
解决方法
我写了这个(迟到)的答案,因为我的问题的“味噌”和“kriegax”的评论.
如果我记得我在任何地方阅读UTF8文件夹在zip文件中的支持是zip文件的一个很大的弱点(因为UTF-8不是官方的zip标准支持?现在可以使用现有的zip应用程序,它们在文件名中支持UTF-8.
然而.在我们的情况下,我们可以用“正常”字符(“a … z”)替换希腊字符,因为压缩文件是由财务打印机生成的,并且在每种情况下都包含一个希腊字符:一个“PI”(只有一个解决方法…).