[英]“IllegalArgumentException: UNMAPPABLE[1]” while zipping a file with Greek characters
我想用ZipOutputStream
在Windows(7)上壓縮文件。 問題是文件名(以及文件文件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);
...
...
但是在最后一行( 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”(僅限解決方案......)。
問題是, CP-737
確實是一個包含希臘字符的代碼頁,但是在Java NIO中,字符集的名稱是x-IBM737
。 參看 http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html
由於ZipCoder
使用的ZipOutputStream
使用配置為在無法映射字符時始終拋出異常的映射器,因此我最終將自己的entryName轉換為指定的字符集,然后通過調用ZipEntry entry = new ZipEntry(entryName)
。 你可以這樣做:
new String(input.getBytes(charset), charset)
這可確保將所有不可阻塞的字符轉換為替換字符,並且不會出現異常。
試試這個,您可能會注意到原始輸入中有一些Unicode控制字符(不可映射)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.