"IllegalArgumentException:UNMAPPABLE [1]",同时使用希腊字符压缩文件

Ste*_*fen 9 java character-encoding zipoutputstream

我想用Windows压缩Windows(7)上的文件ZipOutputStream.问题是文件名(以及文件文件Content)也包含希腊字符(" ??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);
...
...
Run Code Online (Sandbox Code Playgroud)

但是在最后一行(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)
Run Code Online (Sandbox Code Playgroud)

我假设希腊语和UTF-8之间的字符映射一定有什么问题...什么是在文件名中用希腊字符压缩文件的正确方法?

编辑

如果我使用"utf-8"作为字符集,则可以创建zip文件,但压缩文件的名称是错误的:" ðôðƒ0000660040140521_a.txt"(希腊字符丢失)

Ste*_*fen 0

我写了这个(迟来的)答案,因为我的问题的“miso”和“kriegax”的评论。

如果我没记错的话,我曾在任何地方读到过,zip 文件中文件名的 UTF8 支持是 zip 文件的一大弱点(因为 UTF-8 并未得到 zip 标准的官方支持?!?)。可能现在现有的 zip 应用程序确实支持文件名中的 UTF-8。

然而。在我们的例子中,我们可以用“普通”字符(“a...z”)替换希腊字符,因为要压缩的文件是由财务打印机生成的,并且在每种情况下仅包含一个希腊字符:一个“PI”(只是一个解决方法......)。