ZIP是一個在幾乎所有作業系統中都支援的古老的壓縮格式。由於這種格式在1980年代就已經出現,所以設想地不是很周到,常常發生ZIP壓縮檔無法解壓縮,或是解壓縮之後的路徑與檔名是亂碼的問題。尤其實在跨Unix-like系統和Windows系統的時候,這些問題更常會發生。



在Linux作業系統上,我們會習慣使用unzip這個指令工具來解壓縮ZIP檔案。

linux-unzip

有時候也會用7z指令來解壓縮ZIP檔案。

linux-unzip

基本的解壓縮指令

使用unzip指令來解壓縮ZIP壓縮檔的最基本方式如下:

unzip ZIP壓縮檔案的路徑

如果ZIP壓縮檔案有用密碼來加密,則可以替unzip指令加上-P參數來代入解壓縮密碼,如下:

unzip -P "解壓縮密碼" ZIP壓縮檔案的路徑

使用7z指令來解壓縮ZIP壓縮檔的最基本方式如下:

7z x ZIP壓縮檔案的路徑

如果ZIP壓縮檔案有用密碼來加密,則可以替7z指令加上-P參數來代入解壓縮密碼,如下:

7z x -p"解壓縮密碼" ZIP壓縮檔案的路徑

以下將針對使用unzip指令和7z指令時會遇到的問題進行探討。

壓縮檔內路徑中的非ISO-8859-1標準中的字元,使用unzip指令和7z指令解壓縮時變成亂碼

如下圖,unzip指令在解壓縮由Windows作業系統(此處是Windows 7繁體中文版本)內建的ZIP壓縮工具所建立出來的ZIP壓縮檔案時,會導致解壓縮出來的檔案路徑中,非ISO-8859-1標準中的字元(例如中文、日文等)出現亂碼。

linux-unzip

unzip指令也有可能會出現mismatching "local" filenamecontinuing 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,指令如下:

unzip -O big5 ZIP壓縮擋路徑

linux-unzip

而WinRAR和WinZIP所建立出來的壓縮檔都已經是UTF-8編碼了,所以比較不會有亂碼問題。

那麼如果是用7z指令來解壓縮非UTF-8編碼的ZIP壓縮檔呢?要怎麼樣才可以指定編碼方式?很遺憾,7z指令貌似沒有提供指定編碼方式的功能。

使用unzip指令時出現unsupported compression method 99

如下圖,unzip指令在解壓縮由WinRAR或WinZIP所建立出來的含壓縮密碼的ZIP壓縮檔案時,卻出現unsupported compression method 99,而使得解壓縮工作無法成功進行。

linux-unzip

這是由於WinRAR或WinZIP在替ZIP壓縮檔加上密碼時,預設使用的加密方式是「AES」的關係,而不是ZIP傳統的加密方式。若遇到這類的ZIP壓縮檔案,就無法使用unzip指令來解壓縮了,只能夠使用7z指令。

linux-unzip

linux-unzip

使用unzip指令時出現need PK compat. v5.1 (can do v4.6)

如下圖,unzip指令在解壓縮由7-Zip所建立出來的含壓縮密碼的ZIP壓縮檔案時,卻出現need PK compat. v5.1 (can do v4.6),而使得解壓縮工作無法成功進行。

linux-unzip

這也是由於7-Zip在替ZIP壓縮檔加上密碼時,預設使用的加密方式是「AES」的關係,而不是ZIP傳統的加密方式。若遇到這類的ZIP壓縮檔案,就無法使用unzip指令來解壓縮了,只能夠使用7z指令。所以如果這類的ZIP壓縮檔案又不是以UTF-8來編碼的話,亂碼問題就沒救了。

linux-unzip