快速修复
# 一键:指定编码解压(GBK 例;GB18030 覆盖超集,生僻字需要)
unzip -O GBK 文件.zip
你会遇到什么
从 Windows(WinRAR/360 压缩/好压)收到的 zip,在 Linux/WSL 解压后中文文件名变乱码:unzip -l 文件.zip 显示 �����ļ�.txt(应为「测试文件.txt」)。内容(文件内容)正常,只有文件名坏;UTF-8 正常标记的 zip(Linux/macOS 压缩)不受影响。
本文路径:快速修复(30 秒一段命令)→ 一步步排查(可跳读)→ 原理与变体(症状/原因/证据)。赶时间直接跳到「快速修复」。
为什么会这样
zip 规范里文件名默认无编码声明:Windows 压缩软件(360 压缩/WinRAR 老版本等)用本地代码页 GBK/GB2312 存文件名且不置 UTF-8 标志位;Linux 的 unzip 按默认字符集(CP437)解码 → 乱码。zip.js#181 就是这个场景的经典提问。
zip 规范的「文件名编码」设计是历史遗留:格式没有强制编码声明,Windows 压缩软件用本地代码页(中文版 = GBK/GB2312)写文件名;UTF-8 标志位(general purpose bit 11)是后来的约定,老软件不置位。Linux unzip 对无标志位的条目按默认字符集(CP437)解码——GBK 字节被按 CP437 解读,中文全变乱码。
这不是文件损坏,是「写入端编码(GBK)× 读取端解码(CP437)」的错配。
确定性推论:乱码文件名先确认写入端——Windows 压的旧包 = GBK,Linux/mac 新工具压的 = UTF-8(带标志位);解 GBK 包用 unzip -O GBK(Info-ZIP 支持 -O 指定解压字符集)或 7z x -mcp=936;重新打包时用支持 UTF-8 标志位的工具(7-Zip 新版本/zip -r 原生)避免再踩;
判断路径:乱码固定模式(每字错位) = 编码错配,不是文件名真乱。
一步步来
1. 指定编码解压(最常用) — 必做
unzip -O GBK 文件.zip
-O 指定 DOS/Windows 存档编码,Debian unzip 6.00 实测支持;或 unzip -O GB18030 文件.zip(覆盖 GBK 超集,部分生僻字需要)。
2. 查看再解压 — 必做
unzip -O GBK -l 文件.zip
先确认文件名正常,再正式解压。
3. Python 方案(脚本/批量场景) — 必做
zipfile 不直接支持编码指定;可用 unzip -O GBK,或先解压后 convmv -f GBK -t UTF-8 --notest 目录/ 批量改名。
4. 对方侧根治 — 必做
让压缩方用 UTF-8 模式(WinRAR 勾选「文件名使用 UTF-8」;Windows 11 自带 zip 已是 UTF-8),或压缩前把中文名改成拼音/英文。
5. 图形工具 — 必做
7-Zip(Linux 版 p7zip 对 GBK 名兼容较好)、KDE Ark、文件管理器大多能自动识别 GBK 名。
6. 反向场景 — 必做
收到 UTF-8 标志位缺失但实际是 UTF-8 的文件(老 Linux 工具压缩):unzip -O UTF-8 反向修正。
怎么确认修好了
文件名显示正常(实测输出形态):
unzip -O GBK -l → 显示「测试文件.txt」(实测)
实际解压到磁盘同样正常(对比 ls 输出,实测)
复现基线:unzip -l → �����ļ�.txt(乱码,实测)。
其它环境的表现
| 环境 | 说明 |
|---|---|
| 360 压缩/WinRAR 老版 | GBK 文件名无 UTF-8 标志(zip.js#181 场景) |
| -O GBK / -O GB18030 | 均可(实测);GB18030 覆盖生僻字 |
| Windows 11 自带 zip | 已是 UTF-8,不受影响 |
| 图形工具 | 7-Zip / Ark / 文件管理器自动识别 |
| 脚本批量 | unzip -O GBK 或 convmv 改名 |
症状
从 Windows(WinRAR/360 压缩/好压)收到的 zip,在 Linux/WSL 解压后中文文件名变乱码:
$ unzip -l 文件.zip
Length Date Time Name
11 2026-08-29 11:48 �����ļ�.txt # 应为「测试文件.txt」
特征:压缩时是中文名、解压出来是 ���� 一类的替换符; 内容(文件内容)正常,只有文件名坏;UTF-8 正常标记的 zip(Linux/macOS 压缩)不受影响。
原因
zip 规范里文件名默认无编码声明:Windows 压缩软件(360 压缩/WinRAR 老版本等)用本地代码页 GBK/GB2312 存文件名且不置 UTF-8 标志位;Linux 的 unzip 按默认字符集(CP437)解码 → 乱码。 zip.js#181 就是这个场景的经典提问(解压 360 压缩的文件中文乱码)。
解法
- 指定编码解压(最常用):
unzip -O GBK 文件.zip(-O 指定 DOS/Windows 存档编码,Debian unzip 6.00 实测支持);
或 unzip -O GB18030 文件.zip(GB18030 覆盖 GBK 超集,部分生僻字需要)。
- 查看再解压:先
unzip -O GBK -l 文件.zip确认文件名正常,再正式解压。 - Python 方案(脚本/批量场景):读取时把文件名从 GBK 解码——zipfile 不直接支持,
可用 unzip -O GBK 或先解压后 convmv -f GBK -t UTF-8 --notest 目录/ 批量改名。
- 对方侧根治:让压缩方用 UTF-8 模式(WinRAR 勾选「文件名使用 UTF-8」;Windows 11 自带 zip 已是 UTF-8),
或压缩前把中文名改成拼音/英文。
- 图形工具:7-Zip(Linux 版 p7zip 对 GBK 名兼容较好)、KDE Ark、文件管理器大多能自动识别 GBK 名。
- 收到 UTF-8 标志位缺失但实际是 UTF-8 的文件(老 Linux 工具压缩):
unzip -O UTF-8反向修正。
验证证据
- 本地实测(2026-08-29,WSL Ubuntu,unzip 6.00,无网络依赖):
- 夹具:用 python zipfile 构造 GBK 文件名 zip(12 字节占位替换为 GBK 编码的「测试文件.txt」,清掉 UTF-8 标志位,local+central 双头校验),模拟 Windows 压缩软件产物;
- 复现:
unzip -l→ 文件名显示�����ļ�.txt(乱码); - 修复:
unzip -O GBK -l→ 显示测试文件.txt;实际解压到磁盘同样正常(对比 ls 输出); - 说明:
-O GBK与-O GB18030均可;UTF-8 标志位正常的 zip 不受影响。 - 实测复现日志(2026-08-29)
适用工具 (1)
本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。
zip · 外部工具来源与证据
← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡