簡體   English   中英

“IllegalArgumentException:UNMAPPABLE [1]”,同時使用希臘字符壓縮文件

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM