元数据
| id | zip-gbk-filename | 收录 | 2026-08-29 |
|---|---|---|---|
| 问题域 | 编码代理与终端 | 主题分组 | 编码与格式 |
| 适用工具 | zip · 外部工具 | ||
症状
从 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 压缩的文件中文乱码)。
解法
1. **指定编码解压(最常用)**:`unzip -O GBK 文件.zip`(-O 指定 DOS/Windows 存档编码,Debian unzip 6.00 实测支持);
或 `unzip -O GB18030 文件.zip`(GB18030 覆盖 GBK 超集,部分生僻字需要)。
2. **查看再解压**:先 `unzip -O GBK -l 文件.zip` 确认文件名正常,再正式解压。
3. **Python 方案**(脚本/批量场景):读取时把文件名从 GBK 解码——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` 反向修正。
验证证据
- 本地实测(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)
来源与证据
素材来源:https://github.com/gildas-lormeau/zip.js/issues/181
验证证据:Evidence details kept locally (2026-08-29)