2012-02-06 61 views
1

我必須使用apache-commons-compress-1.x API創建文件zip。 我用下面的代碼:ZipArchiveEntry字符集編碼錯誤

File fileZip = new File("D:\\file.zip"); 
ZipEncoding zipEncoding = ZipEncodingHelper.getZipEncoding("UTF8"); 
ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(fileZip); 
zipOut.setEncoding("UTF-8"); 

File entryFile = new File("D:\\attività.jpg"); 
String entryName = entryFile.getName(); 
entryName = new String(entryName.getBytes("UTF-8"), "UTF-8"); 

ZipArchiveEntry entry = new ZipArchiveEntry(entryName); 
entry.setSize(entryFile.length()); 

FileInputStream fInputStream = new FileInputStream(entryFile); 
zipOut.setUseLanguageEncodingFlag(true); 
zipOut.setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPolicy.ALWAYS); 
zipOut.putArchiveEntry(entry); 
zipOut.write(IOUtils.toByteArray(fInputStream)); 
zipOut.closeArchiveEntry(); 

zipOut.flush(); 
zipOut.close(); 

ZIP條目文件名有一個編碼錯誤。如果我用zip管理器構建windows xp打開壓縮文件,文件名是attivit+á.jpg。 請幫助我。

+0

您正在使用XP的內置ZIP管理器?你確定它使用UTF-8嗎?輸出看起來更像8位字符集(例如CP1252) – 2012-02-06 12:10:27

+0

在控制面板 - >區域和語言選項 - >高級(製表符)中。有65001(UTF-8)和其他代碼頁(意大利語) – 2012-02-06 13:50:54

+0

您可以使用'entryName =「attivit \ u00E0-jpg」'?這可以確保.class使用正確的編碼。 getBytes等是多餘的。暫時停下來看看Windows用這個zip文件做什麼。 – 2012-02-06 14:45:49

回答

0

entryName = zipEncoding.encode("attivit\u00E0.jpg"); 
+0

zip條目名稱始終爲attivit +á.jpg – 2012-02-06 17:22:43

+0

然後,問題很可能在Windows端。你仍然可以嘗試「UTF-8」i.o. 「UTF8」用於zipEncoding。或者自己完成編碼:'「attivit%U00E0.jpg」'我相信。最好先用7Zip或WinZip試試zip。 – 2012-02-06 21:05:44

+0

使用WinZip和7Zip就沒關係。 – 2012-02-07 09:54:35