ZIP是一個在幾乎所有作業系統中都支援的古老的壓縮格式。由於這種格式在1980年代就已經出現,所以設想地不是很周到,常常發生ZIP壓縮檔無法解壓縮,或是解壓縮之後的路徑與檔名是亂碼的問題。尤其實在跨Unix-like系統和Windows系統的時候,這些問題更常會發生。
在Linux作業系統上,我們會習慣使用unzip
這個指令工具來解壓縮ZIP檔案。
有時候也會用7z
指令來解壓縮ZIP檔案。
基本的解壓縮指令
使用unzip
指令來解壓縮ZIP壓縮檔的最基本方式如下:
如果ZIP壓縮檔案有用密碼來加密,則可以替unzip
指令加上-P
參數來代入解壓縮密碼,如下:
使用7z
指令來解壓縮ZIP壓縮檔的最基本方式如下:
如果ZIP壓縮檔案有用密碼來加密,則可以替7z
指令加上-P
參數來代入解壓縮密碼,如下:
以下將針對使用unzip
指令和7z
指令時會遇到的問題進行探討。
壓縮檔內路徑中的非ISO-8859-1標準中的字元,使用unzip
指令和7z
指令解壓縮時變成亂碼
如下圖,unzip
指令在解壓縮由Windows作業系統(此處是Windows 7繁體中文版本)內建的ZIP壓縮工具所建立出來的ZIP壓縮檔案時,會導致解壓縮出來的檔案路徑中,非ISO-8859-1標準中的字元(例如中文、日文等)出現亂碼。
unzip
指令也有可能會出現mismatching "local" filename
和continuing with "central" filename version
這兩個訊息。
然而,並不只是Windows作業系統內建的ZIP壓縮工具會導致ZIP壓縮檔案出現亂碼,在Windows作業系統中使用7-Zip來進行ZIP格式的壓縮也會是一樣的情形。這是因為它們都會去使用Windows作業系統所設定的編碼方式(例如Windows 7繁體中文版本是用Big5來編碼的)來編碼ZIP壓縮檔中檔案的路徑,所以在解壓縮時,必須也要使用相同的編碼方式來進行解碼。而Linux作業系統預設的編碼方式是UTF-8,所以如果ZIP壓縮檔並不是使用UTF-8來編碼的就很有可能會出現亂碼。
若要解決這個問題,就必須替unzip
指令加上-O
參數,來代入指定的編碼方式。例如,如果要使用Big5,指令如下:
而WinRAR和WinZIP所建立出來的壓縮檔都已經是UTF-8編碼了,所以比較不會有亂碼問題。
那麼如果是用7z
指令來解壓縮非UTF-8編碼的ZIP壓縮檔呢?要怎麼樣才可以指定編碼方式?很遺憾,7z
指令貌似沒有提供指定編碼方式的功能。
使用unzip
指令時出現unsupported compression method 99
如下圖,unzip
指令在解壓縮由WinRAR或WinZIP所建立出來的含壓縮密碼的ZIP壓縮檔案時,卻出現unsupported compression method 99
,而使得解壓縮工作無法成功進行。
這是由於WinRAR或WinZIP在替ZIP壓縮檔加上密碼時,預設使用的加密方式是「AES」的關係,而不是ZIP傳統的加密方式。若遇到這類的ZIP壓縮檔案,就無法使用unzip
指令來解壓縮了,只能夠使用7z
指令。
使用unzip
指令時出現need PK compat. v5.1 (can do v4.6)
如下圖,unzip
指令在解壓縮由7-Zip所建立出來的含壓縮密碼的ZIP壓縮檔案時,卻出現need PK compat. v5.1 (can do v4.6)
,而使得解壓縮工作無法成功進行。
這也是由於7-Zip在替ZIP壓縮檔加上密碼時,預設使用的加密方式是「AES」的關係,而不是ZIP傳統的加密方式。若遇到這類的ZIP壓縮檔案,就無法使用unzip
指令來解壓縮了,只能夠使用7z
指令。所以如果這類的ZIP壓縮檔案又不是以UTF-8來編碼的話,亂碼問題就沒救了。