You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:15:36