ZIP 压缩与解压

把散着的文件打包成一个 ZIP,或者打开手上的 ZIP 挑出要的那几个。中文文件名会尽量按 GBK 修正,整个流程都在浏览器本机完成。

可以一次多选,也可以把文件直接拖到这个面板里。任何类型的文件都能打进去,包内路径还能改成 img/a.png 这种带子目录的写法。

选择或拖入文件后开始打包

使用说明

ZIP 是把「打包」和「压缩」合在一起的容器:把多个文件和它们的目录结构装进一个文件,顺便用 deflate 把内容压小。这点值得先弄清楚——gzip 只压单个数据流,不记录文件名和目录,更像「把一份数据压小」而不是打包;7z 和 rar 是另外的容器格式,各有自己的算法(7z 常用 LZMA,rar 的算法没有公开实现),本工具只认 ZIP 的存储和 deflate,所以拖进来的 rar、7z 一律解不开,得先在桌面软件里转成 ZIP。

压缩级别 0–9 是 deflate 的档位:0 只打包不压缩,速度最快,包内大小约等于原始大小;1 最快但压得最差;9 最慢但压得最小;默认是 6。实测一份约 772KB 的日志文本:级别 0 出来还是 772KB 上下,级别 1 压到 46KB,级别 6 压到 22KB,级别 9 压到 20KB——1 到 6 的落差最明显,6 往后再压只省一点,时间却要多花。反过来,jpg、png、mp4、pdf 里的字节本来就是压过的,deflate 找不到可压的重复片段,选哪一档都几乎不会变小,小文件还可能因为固定开销大上几十字节,这时把级别设成 0 反而更划算。

中文文件名是这个工具最容易出错的地方。ZIP 规范默认把文件名当 CP437 处理,而 Windows 上的旧工具打中文名时常用 GBK,并且不会置上「文件名是 UTF-8」的标志位,同一串字节按不同编码读出来差别巨大。这里的做法是先自己扫一遍中央目录,读出每个条目的标志位和原始字节:标志位没置、字节又解不成合法 UTF-8 的,就按 GBK 重新解一次,所以「中文名」不会变成乱码。碰上少数用 Big5、Shift-JIS 的包,本工具只能尽力而为。

浏览器出于安全考虑,不能把一堆文件直接写到你的磁盘上。解压这边能做的就是把条目读进内存,让你逐个下载,或者把挑中的条目重新打成一个 ZIP——后者是位置最完整的做法,下载后自己解压就能得到原来的目录结构。压缩这边同理,只能给你一个包文件,不能替你放进某个文件夹。

内存是这套做法的天花板:源文件和压缩结果都待在内存里,几百兆的包很可能让标签页变卡甚至崩掉;ZIP 的长度字段是 32 位的,单个包超过 4GB 就该换别的办法了(有些工具用 ZIP64 扩展绕过,浏览器里也装不下)。要处理大文件,先在桌面软件里分好卷再来。打包出来的包本身也不加密,敏感文件请另外加密。

几个常用的搭配:想确认打包前后的文件和原件一字不差,用文件哈希对比校验值;认不出某个文件的真实类型,用文件魔数识别看它到底是什么格式;文本从压缩包里拿出来就乱码,可以先用乱码修复找回原文,再交给Base64 编解码或字节容量换算处理。PDF 的合并与拆分则用PDF 合并和PDF 拆分。

常见问题

为什么我的中文文件名解出来是乱码?

因为 ZIP 规范默认把文件名当 CP437 处理,而 Windows 上的旧工具打中文名时常用 GBK 编码,还不会置上「文件名是 UTF-8」的标志位,同一串字节按不同编码读出来就完全不同。这里会先读出每个条目的标志位和原始字节,遇到没标 UTF-8 又解不成合法 UTF-8 的名字,就按 GBK 重解一遍,所以大多数中文包都能正常显示。

能解 rar 或者 7z 吗?

不能。rar 和 7z 是各自的容器格式,用的压缩算法也不一样,rar 的算法没有公开实现,7z 常用 LZMA,而本工具只实现了 ZIP 的存储和 deflate 两种方式。请先在桌面软件里把它们转成 ZIP 再来,或者干脆在桌面软件里直接解压。

为什么我压了图片和视频,体积一点没变小?

因为它们的内容本来就是压缩过的:jpg、png、mp4、pdf 里几乎找不到能再用 deflate 压掉的重复片段,选哪个级别都压不动,个别小文件还会因为打包开销大上几十字节。真想减小体积,得重新编码,比如降分辨率、降质量或降码率,那不是打包能做的事。

为什么点下载时没有直接存进我指定的文件夹?

浏览器不允许网页静默地把一堆文件写到你的磁盘上,一次只能给一个文件,或者给你一个包。所以解压这边提供逐个下载,也可以把挑中的条目重新打成一个 ZIP 下载,落地之后再自己解压到想要的位置。

压缩级别该选几?

默认 6 就行。实测一份近似日志的文本,级别 1 能压到 6% 左右,级别 6 约 2.8%,级别 9 约 2.6%:1 到 6 的收益最明显,6 往后再压只省一点点,时间却明显变长。要是包里全是已经压过的文件,选 0 反而最划算,省时间也不会变大。

几百兆的大包能处理吗?

能不能处理主要看内存。源文件和结果都待在内存里,几百兆很容易让标签页变卡甚至崩掉,建议单个包控制在百兆以内。另外 ZIP 的长度字段是 32 位的,超过 4GB 的包要靠 ZIP64 扩展,本工具也不支持。

能不能把文件放进子目录?

能。列表里每一行的包内路径都可以改,用正斜杠分隔就是子目录,例如把 a.png 改成 img/a.png,解压出来就落在 img 目录下。重名的路径会自动加序号避免互相覆盖,打包前确认一下列表里的顺序和名字即可。

加密的 ZIP 能解开吗?

不能。带打开口令的包会被直接拦下并提示去口令,因为这里没有实现 ZIP 的加解密,硬解只会得到一堆坏字节。请先用桌面软件去掉口令、另存一份普通 ZIP 再来。顺带说明,本工具打出来的包也不加密,不要拿它保存敏感文件。