编码代理与终端 · 收录于 2026-08-29 · 适用 1 工具 ✓ 实测验证

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

已验证 2026-08-29zip 解压中文文件名乱码——Windows/360 压的是 GBK,unzip -O GBK 指定编码解压。

快速修复

# 一键:指定编码解压(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 压缩的文件中文乱码)。

解法

  1. 指定编码解压(最常用):unzip -O GBK 文件.zip(-O 指定 DOS/Windows 存档编码,Debian unzip 6.00 实测支持);

或 unzip -O GB18030 文件.zip(GB18030 覆盖 GBK 超集,部分生僻字需要)。

  1. 查看再解压:先 unzip -O GBK -l 文件.zip 确认文件名正常,再正式解压。
  2. Python 方案(脚本/批量场景):读取时把文件名从 GBK 解码——zipfile 不直接支持,

可用 unzip -O GBK 或先解压后 convmv -f GBK -t UTF-8 --notest 目录/ 批量改名。

  1. 对方侧根治:让压缩方用 UTF-8 模式(WinRAR 勾选「文件名使用 UTF-8」;Windows 11 自带 zip 已是 UTF-8),

或压缩前把中文名改成拼音/英文。

  1. 图形工具:7-Zip(Linux 版 p7zip 对 GBK 名兼容较好)、KDE Ark、文件管理器大多能自动识别 GBK 名。
  2. 收到 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 · 外部工具

来源与证据

收录 验证 ✓ 实测验证适用 1 工具
方案含本地实测或来源可复核的解法;未实测项已在文中如实标注。

素材来源:https://github.com/gildas-lormeau/zip.js/issues/181

← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡