Problem entry · machine-readable · 编码代理与终端

zip 解压后中文文件名乱码(Windows/360 压缩的文件在 Linux 上乱码)

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

idzip-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)