2012-04-02 110 views
7

我荏苒文件名中的文件名Unicode字符包含一些特殊字符,如PéréquationLES HOPITAUX NEUFS.xls到不同的文件夾,說溫度使用zip壓縮包

我能夠壓縮文件,但問題是文件的名稱自動更改 P +¬r+¬quationLES HOPITAUX NEUFS.xls

如何在ZIP檔案中支持unicode字符作爲文件名?

+0

嗨看看這個中文文件名zip壓縮probem http://stackoverflow.com/a/21521784/1194578 – mathi 2014-02-03 07:32:25

回答

16

這取決於您使用哪些代碼創建存檔。 舊的 Java壓縮類不像您所需要的那麼靈活。你可以使用Apache Commons Compress。在ZipOutputStream constructor

的一個大問題

ZipArchiveOutputStream ostream = ...; // Your initialization code here 
ostream.setEncoding("Cp437"); // This should handle your "special" characters 
ostream.setFallbackToUTF8(true); // For "unknown" characters! 
ostream.setUseLanguageEncodingFlag(true);        
ostream.setCreateUnicodeExtraFields(
    ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE); 

如果您使用的是Java 7然後你終於有一個Charset參數(可以是UTF-8):Michael Simons寫了這個漂亮的一段代碼無論如何,許多實現不理解Unicode編碼,因爲原始 ZIP文件格式是ASCII,並且沒有Unicode的官方標準。進一步的細節見this post

+0

我正在使用ZipOutputStream類... – Maddy 2012-04-02 10:53:40

+2

在您的流上調用setEncoding(「UTF-8」)或將其作爲FileOutputStream構造函數的參數提供。無論如何,不​​要忘記答案中指出的兼容性問題! – 2012-04-02 11:03:20

+0

import java.util.zip.ZipOutputStream;是我使用的軟件包,它不支持setEncoding(「UTF-8」) – Maddy 2012-04-02 11:19:55

6

Zip規範(歷史記錄)未指定用於嵌入文件名和註釋的字符編碼,原始IBM PC字符編碼集(通常稱爲IBM Code Page 437)應該是唯一的編碼支持。 Jar規範同時明確指定使用UTF-8作爲編碼來對Jar文件中的所有文件名和註釋進行編碼和解碼。我們的java.util.jar和java.util.zip實現嚴格遵循Jar規範,在處理存儲在Jar/Zip文件中的文件名和註釋時,使用UTF-8作爲唯一編碼。

後果?如果文件名包含Cp437之間不兼容的字符,那麼由「傳統」ZIP工具創建的ZIP文件不可用於基於java.util.jar/zip的工具,反之亦然(作爲替代,工具可以簡單地使用默認平臺編碼)和UTF-8

對於大多數歐洲人來說,你是「幸運的」:-)你只需要避免一小撮人物,比如變音人(好吧,我只是在開玩笑) ),但是對於日本人和中國人來說,大部分人物都是運氣不好的。這就是爲什麼臭蟲4244499多年來一直是排名前25的Java Bug中排名第一的原因。該錯誤不再在名單上:-)它已經在OpenJDK 7,b57中最終「修復」了。我仍然保持一個快照記錄/工藤自己:-)

(我會使用「解決方案」比「固定」),該解決方案在JDK7 B57是一組新的ZipInputStream ZipOutStream和ZipFile的構造函數的介紹以特定的「charset」作爲參數,如下所示。

的ZipFile(文件,字符集)

ZipInputStream(InputStream中,字符集)

ZipOutputStream(OutputStream的,字符集)

有了這些新的構造函數,應用程序現在可以訪問這些通過使用特定編碼創建的ZipInputStream或ZipFile對象創建非UTF-8 ZIP文件,或者通過新的ZipOutputStream創建以非UTF-8編碼的Zip文件(os,c harset)構造函數,如果需要的話。

zip是Jar工具的簡化版本,帶有「-encoding」選項以支持條目名稱和註釋的非UTF8編碼,它可以作爲演示如何使用新的API(我使用過它作爲一個單元測試)。如果將「-encoding」正式引入Jar工具中,我仍在與自己辯論...

+0

我正在使用java 6 :) – Maddy 2012-04-02 11:35:32