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
- 类型：数据压缩