ZIP 檔案格式是一種資料壓縮和文件儲存的檔案格式，原名 Deflate，發明者為菲爾卡茨，他於 1989 年 1 月公佈了該格式的資料。ZIP 通常使用字尾名 zip，它的 MIME 格式為 applicationzip。目前，ZIP 格式屬於幾種主流的壓縮格式之一，其競爭者包括 RAR 格式以及開放原始碼的 7z 格式。從效能上比較，RAR 及 7z 格式較 ZIP 格式壓縮率較高，而 7Zip 由於提供了開源的壓縮工具而逐漸在更多的領域得到應用。Microsoft 從 Windows ME 作業系統開始內建對 zip 格式的支援，即使使用者的電腦上沒有安裝解壓縮軟體，也能開啟和製作 zip 格式的壓縮檔案，OS X 和流行的 Linux 作業系統也對 zip 格式提供了類似的支援。因此如果在網路上傳播和分發檔案，zip 格式往往是最常用的選擇。 歷史 前身 1985 年一家名為 SEA（System Enhancement Associates，系統增強夥伴）的小公司開發了一個在 MSDOS 平臺下的商業壓縮軟體，名為 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 系統內，通常都是使用大寫字母作為字尾名的。（這是由於 MSDOS 執行在 FAT 檔案系統上。） Winzip 的面世 Windows 30 面世之前，有兩種格式與 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 50，但是 Winzip 在 2003 年釋出的 Winzip 9 卻被證明 了 無法與之相容。雙方都互相指責對方違背了 Zip 的自由開放精神。這是 Zip 自誕生日起最嚴峻的挑戰。 檔案頭 使用文字編輯器開啟任何一個 Zip 檔案，都能看到檔案的前兩個字母為：PK。 技術 ZIP 是一種相當簡單的分別壓縮每個檔案的存檔格式，分別壓縮檔案允許不必讀取另外的資料而檢索獨立的檔案。理論上，這種格式甚至允許對不同的檔案使用不同的演算法。不管用何種方法，存檔中包含很多小檔案的時候，佔用空間會明顯的比壓縮成一個獨立的檔案（在類 Unix 系統中一個經典的例子是：普通的 targz 存檔是由一個使用 gzip 壓縮的 TAR 存檔組成）要大。 ZIP 的規約指出檔案可以不經壓縮或者使用不同的壓縮演算法來儲存。然而實際上 ZIP 幾乎總是在使用卡茨（Katz）的 DEFLATE 演算法。 ZIP 支援基於對稱加密系統的一個簡單的密碼，現在已知有嚴重的缺陷，存在已知明文攻擊、字典攻擊和暴力攻擊。ZIP 也支援分卷壓縮。 近來，ZIP 加入了新的壓縮和加密演算法，不過這些新演算法並沒有被許多工具所支援並且沒有得到廣泛應用。 壓縮方法 用來對比壓縮大小的是的內容和最大壓縮比。 Shrinking（方法 1） 收縮（Shrinking）是 LZW 的微小調整的一個異體，同樣也受到 LZW 專利問題的影響。因為不明確這項專利是否涵蓋反收縮，一些開放原始碼的專案（例如 InfoZIP）決定謹慎行事，在預設的構造裡不包含反收縮的支援。 Reducing（方法 25） 縮小（Reducing）壓縮重複位元組序列的組合，然後應用一個基於機率的編碼得到結果。 Imploding（方法 6） 爆聚（Imploding）使用一個滑動視窗壓縮重複位元組序列，然後使用多重 ShannonFano 樹壓縮得到結果。 Tokenizing（方法 7） 令牌化（Tokenizing）的方法數是保留的。PKWARE 規約沒有為其定義一個演算法。 Deflate 和增強的 Deflate（方法 8 和 9） 這些方法使用 Deflate 演算法。Deflate 允許最大 32K 的視窗，而增強的 Deflate 允許最大 64K 的視窗。增強版完成任務稍稍成功一些，但是並沒有得到廣泛的支援。 Deflate 比較尺寸是 521MiB（使用 pkzip for Windows，版本 8000038 測試） 增強的 Deflate 比較尺寸是 528MiB（使用 pkzip for Windows，版本 8000038 測試） PKWARE Data Compression Library Imploding（方法 10）PKWARE 資料壓縮庫爆聚（PKWARE Data Compression Library Imploding），官方 ZIP 格式規約就此沒有給出更多的資訊。 比較尺寸是 616MiB（使用 pkzip for Windows，版本 8000038 測試，選擇二進位制模式） 方法 11 此方法被 PKWARE 保留。 Bzip2（方法 12） 此方法使用 bzip2 演算法。此演算法比 deflate 高效但是並沒有被（基於 Windows 平臺的）工具所支援。 比較尺寸是 506MiB（使用 pkzip for Windows，版本 8000038 測試） 檔名編碼方式 歷史上，ZIP 僅支援一種用於檔案名稱（而非內容）的編碼方式，即 IBM Code Page 437。在最新版的標準中則規定通用旗標第十一位元為語言編碼旗標（Language encoding flag，EFS）。若該旗標未設 置，則仍舊使用 Code page 437；若已設 置，則使用 UTF8 作為檔案名稱的編、解碼方式。 但在實務上，許多實現使用了 UTF8 卻未設 置該旗標，或者使用了這兩種以外的編碼方式，導致非英文 zhhans 檔名；zhhant 檔名 解碼困難，容易出現亂碼。 缺點 由於出現於市場的時間早，現在 Zip 檔案與其他壓縮格式相比有眾多無法忽視的缺點。 原生並不支援 Unicode 檔案名稱（見 檔名編碼方式），容易導致一部分資源共享困難，在東亞文化圈的資源交流尤其顯著；無法與 7z 相比的壓縮比率以及如 WinRAR 的 Recovery Record 修復支援功能的缺乏亦都是其衰微的原因。 針對上述缺點，前 WinZip 團隊有開發後繼者 ZIPX 格式，但仍不普及。 參考資料 參見 WinZip LZW LZ77 RAR 壓縮軟體列表 壓縮軟體比較 目錄遍歷，與壓縮檔相關的知名安全漏洞。 外部連結 Winzip PKware RARlab 7Zip PeaZip Category 歸檔格式 Category 無失真壓縮演算法