CodeIgniter 3.x ZIP压缩中文乱码需手动转码为GBK或UTF-8,因内置zip类不处理编码,默认按CP437写入;CI4已移除该类,推荐使用ZipArchive扩展或社区包ci4-zip。

CodeIgniter 项目中做 ZIP 压缩与解压,核心依赖的是框架内置的 zip 类(CI3)或第三方扩展(CI4 默认不带 ZIP 类),但实际使用中常遇到中文文件名乱码、路径识别异常、压缩后无法正常解压等问题。关键不在“有没有工具”,而在于「怎么用对编码」和「怎么适配目标环境」。
CI3 的 zip 类压缩:中文名必须转码
CI3 的 $this->zip 不处理字符编码,默认把 UTF-8 字符串原样写入 ZIP 中央目录,而 Windows 解压工具(如自带解压器、WinRAR)默认按 CP437 或 GBK 解析,导致中文变乱码。
- 压缩前手动将文件路径/名称转为 GBK(适配 Windows 用户为主)或 UTF-8(适配 macOS/Linux 或 7-Zip/unar)
- 推荐用
iconv('UTF-8', 'GBK//IGNORE', $filename)或mb_convert_encoding($filename, 'GBK', 'UTF-8') -
$this->zip->set_charset('UTF-8')是无效操作——它只改内部变量,不改变 ZIP 写入字节流 - 确保服务器 locale 支持目标编码,例如 Linux 下执行
locale -a | grep GBK查看是否含zh_CN.GBK
CI3 添加文件与目录的正确写法
避免路径拼接错误和空目录缺失,尤其在打包用户上传内容时:
- 添加单个文件:
$this->zip->read_file('./uploads/张三_报告.pdf');—— 路径需真实存在,且建议用相对路径(相对于入口文件) - 添加带子目录的文件:
$this->zip->add_data('report/张三_报告.pdf', $file_content);—— 目录结构由文件名中的斜杠自动创建 - 添加空目录:
$this->zip->add_dir('backup/logs/');—— 注意末尾斜杠不能省,否则会被当成文件 - 批量加文件时,可用循环调用
add_data()或read_file(),不要试图一次性传数组(CI3 的 zip 类不支持数组批量读取)
解压操作不在 CI 内置能力范围内
CI 框架本身不提供 ZIP 解压功能,需借助 PHP 原生扩展或命令行工具:
- 启用
ZipArchive扩展(PHP 配置中取消注释extension=zip),再用标准方式解压: $zip = new ZipArchive(); if ($zip->open('archive.zip') === TRUE) { $zip->extractTo('./unzipped/'); $zip->close(); }- Windows 环境下也可用系统
tar -xf archive.zip(Win10 1709+ 内置),或 PowerShell:Expand-Archive -Path archive.zip -DestinationPath ./unzipped - Linux/macOS 推荐用
unzip -o archive.zip -d ./unzipped,-o参数自动覆盖同名文件
CI4 项目如何处理 ZIP
CI4 官方移除了内置 zip 类,推荐两种实用方案:
- 安装社区维护的扩展包:
composer require mtdowling/ci4-zip,用法与 CI3 类似,但支持现代编码处理 - 直接使用 PHP 原生
ZipArchive:更可控,适合需要精细控制压缩等级、密码保护、大文件流式写入等场景 - 若需前端触发下载,仍可组合使用:
addData()+getZip()得到二进制流,再用response()->setContentType('application/zip')->setBody($zipBytes)输出


















