一個 ZIP 檔做兩件分開的事,而關於它的幾乎所有困惑,都來自把這兩件事當成一件。它把多個檔案打包成單一檔案,而且它壓縮它們。第一件永遠有效。第二件只是有時候有效,而知道是什麼時候,能省下大量白費的力氣。
ZIP 的標準方法是找重複。當一段位元組序列先前出現過,它就存一個簡短的參照——「和 300 個位元組之前那 40 個一樣」——而不是那些位元組本身。
它是無損的:解開之後每一個位元組都原樣回來。沒有任何東西被近似,這就是為什麼 ZIP 對文件、試算表和程式碼是安全的,而影像或音訊壓縮不是。
而因為它靠重複工作,省下多少完全取決於內容有多重複。
省很多——常常 70% 到 95%:
幾乎沒有——0% 到 3%:
第二份清單的理由是同一個:那些格式已經被壓縮過了。重複已經被移除過一次,沒有留下任何東西給 ZIP 找。壓縮已經壓過的資料,偶爾會產生一個比原檔稍微大一點的檔案,因為封存檔本身也要記帳。
這解釋了關於 ZIP 最常見的失望:你選了 200 MB 的旅遊照片、壓縮它們,結果封存檔是 199 MB。沒有任何東西壞掉。那就是正確的結果,而且沒有任何設定能改變它。
這件事值得知道,因為它一口氣解釋了上面好幾項。
一個 .docx、.xlsx 或 .pptx 是一個裝著 XML 檔的 ZIP 封存檔。一個 EPUB 是一個裝著 HTML 的 ZIP 封存檔。每一種都一樣:把檔案改名成 .zip,你就能打開它看裡面的零件。
所以壓縮一個裝滿 Word 文件的資料夾,是有用地把它們打包了,但幾乎沒有壓縮到——你在壓縮一堆 zip。
就算完全沒有縮小,打包本身仍有真實價值:
但如果目標真的是一個更小的檔案,而內容是照片、影片、音訊或 PDF,壓縮封存就是錯的工具。去壓縮那些檔案本身——體積真正住的地方是那裡。
這件事要緊,而且被廣泛誤解。
ZipCrypto 是 1989 年原始的密碼方法。它徹底被攻破了。現成的工具可以在幾秒到幾分鐘內還原內容,而那個攻擊根本不需要猜你的密碼。如果一個 ZIP 是用這種方式保護的,就把它當成沒有保護。
AES-256 是現代的方法,而且是真的強。但支援度不一致:不是每個工具在建立封存檔時都提供它,而有些舊工具打不開。如果你在加密要緊的東西,確認一下你的工具用的是哪一種——許多為了相容性預設用弱的那個。
還有一件兩種方法預設都不解決的事:檔名清單通常不用密碼就看得到。任何拿到那個封存檔的人都能看到裡面有 薪資檢討-2026.xlsx,即使他們打不開。有些工具可以連檔案清單一起加密;多數不會,除非你主動要求。
如果你在 Windows 和 Mac 之間交換帶中文、日文或韓文檔名的封存檔,你會遇到這一個。
ZIP 格式對於檔名使用哪種字元編碼,沒有一條可靠、被普遍遵守的規則。一個 Windows 工具可能用系統的本地編碼寫入;一台 Mac 解開它時假設是 UTF-8,於是在本該是名字的地方產生一堆讀不出來的亂碼。檔案本身完好無缺——壞掉的只有名字。
實務上的緩解:用一個明確寫 UTF-8 檔名的工具,或者當封存檔要跨平台時用 ASCII 命名,或者用一個編碼規則比較嚴格的格式。這不是你那一份的 bug——這是這個格式存在了幾十年的缺口。
在 Mac 上建立的封存檔,常常含有一個 __MACOSX 資料夾和散落的 .DS_Store 檔。它們裝的是 Mac 專屬的中繼資料,無害,而且在每一個 Windows 使用者眼中看起來像雜物或錯誤。多數壓縮工具有排除它們的選項,在把封存檔寄給別人之前值得打開。