PHP(Laravel)生成Zip在Lhaplus解压时日文文件名乱码求助
解决Lhaplus解压日文文件名乱码问题
问题根源
Lhaplus对Zip文件的文件名编码识别逻辑较严格,它默认优先适配CP932(Shift_JIS的日本工业标准扩展编码),而非普通SJIS;同时原生ZipArchive未明确编码标记时,Lhaplus会错误解析日文文件名。
解决方案
方案1:替换编码为CP932
CP932是SJIS的超集,包含更多日文专用字符,Lhaplus对其支持更完善。修改编码转换代码:
// 替换原mb_convert_encoding行 if (!$zip->addFile($fileName, mb_convert_encoding($baseName, "CP932", "UTF-8"))) { throw new \RuntimeException(sprintf('Add file failed: %s', $fileName)); }
方案2:启用UTF-8文件名标记(PHP ≥7.2.0)
PHP 7.2.0及以上版本的ZipArchive支持通过标记强制使用UTF-8文件名,让Lhaplus正确识别:
// 修改open方法参数,添加UTF-8编码标记 if ($zip->open(public_path($zipFileName), ZipArchive::CREATE | ZipArchive::OVERWRITE | ZipArchive::FL_ENC_UTF_8) === TRUE){ $fileName = "pdf/03510063220_00016501社名社名_spt.pdf"; $baseName = "03510063220_00016501社名社名_spt.pdf"; // 直接传入UTF-8文件名,无需转码 if (!$zip->addFile($fileName, $baseName)) { throw new \RuntimeException(sprintf('Add file failed: %s', $fileName)); } $zip->close(); }
注意:此方案依赖PHP版本≥7.2.0,需确保服务器已启用mbstring扩展。
方案3:用第三方库兼容多工具
如果要同时适配7zip、WinRAR和Lhaplus,推荐使用chumper/zipper库简化编码处理:
首先安装库:
composer require chumper/zipper
然后编写代码:
use Chumper\Zipper\Zipper; $zipper = new Zipper; $zipper->make(public_path($zipFileName))->add($fileName, $baseName); $zipper->setEncoding('CP932'); $zipper->close();
验证方式
生成Zip后先用Lhaplus解压检查文件名,再用7zip、WinRAR验证兼容性,确保无反向乱码问题。
内容的提问来源于stack exchange,提问作者Abdus Salam
相关产品推荐
相关产品推荐

