• 技术文章 >后端开发 >PHP问题

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

    藏色散人藏色散人2021-06-03 09:09:56原创73

    php压缩中文文件名乱码的解决办法:首先将中文压缩包名用iconv函数转码;然后通过ZipArchive的对象处理zip文件即可。

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

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

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

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

    <?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中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php
    上一篇:php7和hvvm的区别是什么 下一篇:php怎么实现n的阶乘
    第16期线上培训班

    相关文章推荐

    • php curl获取title标题乱码怎么办• 如何解决html form乱码问题• html post乱码怎么办• php ziparchive中文乱码怎么办• vb输出html乱码怎么办

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网