ZIP格式

ZIP文件格式是一種數據壓縮和文檔儲存的文件格式，原名Deflate，發明者為菲爾·卡茨（Phil Katz），他於1989年1月公布了該格式的相關資料。ZIP通常使用後綴名「.zip」，它的MIME格式為application/zip。目前，ZIP格式屬於幾種主流的壓縮格式之一，其競爭者包括RAR格式以及開放源碼的7z格式。從性能上比較，RAR及7z格式較ZIP格式壓縮率較高，而7-Zip由於提供了開源的壓縮工具而逐漸在更多的領域得到應用。Microsoft從Windows ME作業系統開始內置對zip格式的支持，即使使用者的電腦上沒有安裝解壓縮軟體，也能打開和製作zip格式的壓縮文件，macOS和流行的Linux作業系統也對zip格式提供了類似的支持。因此如果在網路上傳播和分享文件，zip格式往往是最常用的選擇。

## 歷史

### 前身

1985年一家名為SEA（System Enhancement Associates，系統增強夥伴）的小公司開發了一個在MS-DOS平台下的商業壓縮軟體，名為ARC。當時的軟體發行方式與現在略有不同，使用者購買了軟體，除了能得到軟體的可執行文件，還能得到一份C語言的原始碼。當時的卡茨與很多用電腦的普通人一樣，缺乏資金購買昂貴的商業軟體。當時卡茨從網上下載了一份ARC的C語言原始碼，並用彙編語言將其重新編寫並編譯了出來。這個軟體名為：PKARC（Phillip Katz' ARC）。PKARC因為是卡茨參照原始碼編寫的，所以完全兼容ARC，並且性能上比ARC高。卡茨當時將這個新軟體上傳到了網路上。顯然，卡茨此舉造成對SEA公司的侵權。SEA最初希望通過聯絡卡茨，使PKARC成為SEA公司旗下的一款產品，但是被卡茨拒絕了。最終，雙方對簿公堂，結果是卡茨敗訴，他被判對SEA公司賠款以及停止發放PKARC。後來，卡茨在對PKARC續作的開發中，被迫重新改寫所有代碼。PKARC即為下文提及的PKZIP的前身，但卡茨沒有從PKARC賺到一分錢，還是窮困潦倒，又因為酗酒等眾多原因，2000年死在一個汽車旅館中。

### 誕生

這場官司過後幾周，卡茨就製作出了新的壓縮軟體PKZIP（Phillip Katz' ZIP）。這款全新的軟體比ARC的壓縮率、壓縮性能都要高許多，並且包含更多功能。此後，卡茨還將ZIP的所有技術參數公諸於眾。ZIP（意為「速度」）這一名稱是由卡茨的朋友羅伯特·馬宏利（Robert Mahoney）建議的。他們想暗示，他們的產品比ARC在一定時間內更快速。這個名字往往被寫成大寫字母，因為在DOS系統內，通常都是使用大寫字母作為後綴名的。（這是由於MS-DOS運行在FAT文件系統上。）

### Winzip的面世

Windows 3.0面世之前，有兩種格式與ZIP同樣流行，一個是LHA（LHArc），另一個是ARJ（Archiver Robert Jung），直至1995年，這3種壓縮格式都是PC應用的主流。1995年，微軟發布了Windows95，當時從DOS轉移到Windows的使用者們，極度渴求在圖形界面下的優良軟體。Winzip以其優良的性能以及不太晦澀的圖形使用者界面吸引了使用者的目光，在當時獲得了大量的市場占有量。其實，當時的WinZip僅僅是一個調用DOS資源的GUI外殼，但是其從Windows 3就開始的製作經驗使其GUI性能和外觀都比當時的流行軟體要好。很快地，WinZip就成為了當時一個很流行的軟體，這同時也帶動了ZIP的傳播。由於在前期太受歡迎，使得到後期很多用戶都以為，是WinZip創造了ZIP，其實這是一個誤解，關於WinZip更詳細的資訊，參見WinZip。

## 發展

因格式開放且免費，越來越多的軟體內嵌支援開啟Zip文件。這時，Zip文件越來越像一個經過壓縮的透明文件夾。

- 自Windows Me以來，Windows內嵌支持打開以及壓縮Zip文件。
- 一些下載軟體的工具，支持部分下載Zip文件然後進行恢復。
- 越來越多的軟體內嵌支持打開Zip文件。
- 幾乎所有的壓縮軟體都支持打開及製作Zip文件。

## 危機

基本上，Zip文件的發展主要由 PKware 公司與 WinZip 共同推動。但兩家公司在部分問題上存在互相猜疑，最終導致其發展進程放緩。人們目前最想在Zip文件實現的目標，就是加強目前Zip文件的加密能力。就目前而言，Zip的文件加密能力較弱，僅依一個口令保護，無法滿足大部分情況下的安全需求。雖然卡茨在世時公開了格式，留有為日後升級的空間，但Winzip僅僅是一個使用者，無法發布新標準，其標準的制訂權依然保留在PKware手中。

2002年時，PKware開發了支持256位AES加密的PKZIP 5.0，但是Winzip在2003年發布的Winzip 9卻被證明了無法與之相容。雙方都互相指責對方違背了Zip的自由開放精神。

## 文件頭

使用文本編輯器打開任何一個Zip文件，都能看到文件的前兩個字母為：PK。

## 技術

ZIP是一種相當簡單的分別壓縮每個文件的存檔格式，分別壓縮文件允許不必讀取另外的數據而檢索獨立的文件。理論上，這種格式甚至允許對不同的文件使用不同的演算法。不管用何種方法，存檔中包含很多小文件的時候，占用空間會明顯的比壓縮成一個獨立的文件（在類Unix系統中一個經典的例子是：普通的tar.gz存檔是由一個使用gzip壓縮的TAR存檔組成）要大。

ZIP的規約指出文件可以不經壓縮或者使用不同的壓縮演算法來存儲。然而實際上ZIP幾乎總是在使用卡茨（Katz）的DEFLATE演算法。

ZIP支持基於對稱加密系統的一個簡單的密碼，現在已知有嚴重的缺陷，存在已知明文攻擊、字典攻擊和暴力攻擊。ZIP也支持分卷壓縮。

近來，ZIP加入了新的壓縮和加密演算法，不過這些新演算法並沒有被許多工具所支持並且沒有得到廣泛應用。

### 壓縮方法

ZIP格式的規格記錄了以下幾種壓縮方法：

Shrinking（方法1）:收縮（Shrinking）是LZW的微小調整的一個異體，同樣也受到LZW專利問題的影響。因為不明確這項專利是否涵蓋反收縮，一些開放源碼的項目（例如Info-ZIP）決定謹慎行事，在默認的構造里不包含反收縮的支持。

Reducing（方法2-5）:縮小（Reducing）壓縮重複字節序列的組合，然後應用一個基於機率的編碼得到結果。

Imploding（方法6）:爆聚（Imploding）使用一個滑動窗口壓縮重複字節序列，然後使用多重Shannon-Fano樹壓縮得到結果。

Tokenizing（方法7）:令牌化（Tokenizing）的方法數是保留的。PKWARE規約沒有為其定義一個演算法。

Deflate和增強的Deflate（方法8和9）:這些方法使用Deflate演算法。Deflate允許最大32K的窗口，而增強的Deflate允許最大64K的窗口。增強版完成任務稍稍成功一些，但是並沒有得到廣泛的支持。Deflate比較尺寸是52.1MiB（使用pkzip for Windows，版本8.00.0038測試）

增強的Deflate比較尺寸是52.8MiB（使用pkzip for Windows，版本8.00.0038測試）

PKWARE Data Compression Library Imploding（方法10）:PKWARE數據壓縮庫爆聚（PKWARE Data Compression Library Imploding），官方ZIP格式規約就此沒有給出更多的資訊。比較尺寸是61.6MiB（使用pkzip for Windows，版本8.00.0038測試，選擇二進位模式）

方法11:此方法被PKWARE保留。

Bzip2（方法12）:此方法使用bzip2演算法。此演算法比deflate高效但是並沒有被（基於Windows平台的）工具所支持。比較尺寸是50.6MiB（使用pkzip for Windows，版本8.00.0038測試）

### 檔名編碼方式

歷史上，ZIP僅支援一種用於檔案名稱（而非內容）的編碼方式，即IBM Code Page 437。在最新版的標準中則規定通用旗標第十一位元為語言編碼旗標（Language encoding flag，EFS）。若該旗標未設置，則仍舊使用Code page 437；若已設置，則使用UTF-8作為檔案名稱的編、解碼方式。

但在實務上，許多實現使用了UTF-8卻未設置該旗標，或者使用了這兩種以外的編碼方式，導致非英文檔名解碼困難，容易出現亂碼。

## 缺點

由於出現於市場的時間早，現在Zip檔案與其他壓縮格式相比有眾多無法忽視的缺點。

原生並不支援Unicode檔案名稱（見#檔名編碼方式），容易導致一部分資源共享困難，在東亞文化圈的資源交流尤其顯著；無法與7z相比的壓縮比率以及如WinRAR的Recovery Record修復支援功能的缺乏亦都是其衰微的原因。

針對上述缺點，前WinZip團隊有開發後繼者ZIPX格式，但仍不普及。

## 基本資料

- 日語原文：ZIP
- 域：

<image>

- 擴展名：.zip
- mime：`application/zip`
- 統一類型標識：com.pkware.zip-archive
- magic：`PK\003\004 or PK\005\006 (empty archive)` (unless a bootstrap script is present)
- 所有者：Phil Katz
- 類型：數據壓縮