一个 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 用户眼中看起来像杂物或错误。多数压缩工具有排除它们的选项,在把归档寄给别人之前值得打开。