如何解决php压缩中文文件名乱码问题

藏色散人
发布: 2021-06-03 09:09:56
原创
4190人浏览过
php压缩中文文件名乱码的解决办法:首先将中文压缩包名用iconv函数转码;然后通过ZipArchive的对象处理zip文件即可。

如何解决php压缩中文文件名乱码问题

本文操作环境:Windows10系统、PHP7.1版,DELL G3电脑

PHP解压ZIP压缩包,解决中文乱码问题

修复原生ZipArchive的中文乱码问题

中文的zip压缩包名和中文的文件名会导致PHP原生自带的ZipArchive乱码,导致extractTo方法失效:

立即学习PHP免费学习笔记(深入)”;

<?php
$zip = new \ZipArchive;
$zipfile = "./test.zip";
$res = $zip->open($zipfile);
$toDir = "./test";
$s = $zip->extractTo($toDir);
print_r(scandir($toDir));
//作者:Dorm_Script
//链接:http://www.jianshu.com/p/3efa924fd809
登录后复制

参考一篇blog,原作的解决办法是:

<?php
$zip = new \ZipArchive;
$zipfile = "./test.zip";
$res = $zip->open($zipfile);
$toDir = "./test";
if(!file_exists($toDir)) {
    mkdir($toDir);
}
$docnum = $zip->numFiles;
for($i = 0; $i < $docnum; $i++) {
    $statInfo = $zip->statIndex($i);
    if($statInfo['crc'] == 0) {
        //新建目录
        mkdir($toDir.'/'.substr($statInfo['name'], 0,-1));
    } else {
        //拷贝文件
        copy('zip://'.$zipfile.'#'.$statInfo['name'], $toDir.'/'.$statInfo['name']);
    }
}
print_r(scandir($toDir));
//作者:Dorm_Script
//链接:http://www.jianshu.com/p/3efa924fd809
登录后复制

但是当$zipfile是中文编码时,也就是压缩包的名称是中文时,解压仍然会失败。

此时单独再将中文压缩包名用iconv函数转码后再使用:

    //zip文件名
        $fileName = '中文.zip';
        //zip文件相对服务器根目录的保存路径
        $uploads_dir = "/Public/zipUpload";
        //zip文件完整的保存路径
        $zipName = $_SERVER['DOCUMENT_ROOT'].$uploads_dir.'/'.$fileName;
        //将目标路径名称赋值为fileName最后的'.zip'四个字符之外的全部字符构成的字符串
        $toDir = $_SERVER['DOCUMENT_ROOT'].$uploads_dir.'/'.substr($fileName,0,strlen($fileName)-4);
        $zip = new \ZipArchive;//新建一个ZipArchive的对象
        /*
        通过ZipArchive的对象处理zip文件
        $zip->open这个方法的参数表示处理的zip文件名。
        如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
        */
        $res = $zip->open(iconv ( 'UTF-8', 'GB2312', $zipName));
        if ($res === TRUE){
            if (!is_dir(iconv ( 'UTF-8', 'GB2312', $toDir))) {
                mkdir(iconv ( 'UTF-8', 'GB2312', $toDir), 0777, true);
            }
            //$zip->extractTo($toDir);
            $docnum = $zip->numFiles;
            for($i = 0; $i < $docnum; $i++) {
                $statInfo = $zip->statIndex($i);
                if($statInfo['crc'] == 0) {
                    //新建目录
                    mkdir(iconv ( 'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name']), 0777, true);
                } else {
                    //拷贝文件,特别的改动,iconv的位置决定copy能不能work
                    if(copy('zip://'.iconv ( 'UTF-8', 'GB2312', $zipName).'#'.$statInfo['name'], iconv ( 'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name'])) == false){
                        echo 'faild to copy';
                    }
                }
            }
            print_r(scandir(iconv ( 'UTF-8', 'GB2312',$toDir)));
            $zip->close();//关闭处理的zip文件
        }
        else{
            echo 'failed, code:'.$res.'<br>';
        }
登录后复制

上述代码的输出:

Array
(
    [0] => .
    [1] => ..
    [2] => ��
    [3] => Ҫ
)
登录后复制

压缩包的目录:

 中文.zip

├── 不

│   └── 要

│       └── dance.txt

└── 要

    └── dance1.txt

推荐学习:《PHP视频教程

以上就是如何解决php压缩中文文件名乱码问题的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号