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 格式的壓縮檔案，OS X 和流行的 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 自誕生日起，第一個對於它來說最嚴峻的挑戰。

## 檔案頭

使用任何一種文字編輯器打開任何一個 Zip 檔案，都能看到前兩個字母為：PK

## 技術

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

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

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

在近來一段時間，ZIP 加入了包括新的壓縮和加密方法的新特徵，不過這些新特徵並沒有被許多工具所支援並且沒有得到廣泛應用。

### 壓縮方法

用來對比壓縮大小使用的是 [1] 的內容和最大壓縮比。

**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 檔案與其他壓縮格式相比有眾多無法忽視的缺點。

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

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

## 參見

* WinZip
* LZW
* LZ77
* RAR
* 壓縮軟體列表
* 壓縮軟體比較

## 外部連結

* Winzip （頁面存檔備份，存於網際網路檔案館）
* PKware （頁面存檔備份，存於網際網路檔案館）
* RARlab （頁面存檔備份，存於網際網路檔案館）
* 7-Zip （頁面存檔備份，存於網際網路檔案館）
* PeaZip （頁面存檔備份，存於網際網路檔案館）