java – “IllegalArgumentException:UNMAPPABLE [1]”,同时使用希腊字符压缩文件

我想使用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”(只有一个解决方法…).

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...