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

来源:互联网 发布:文明网络标语 编辑:程序博客网 时间:2024/05/11 05:52

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

测试环境是windows10
中文的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
阅读全文
1 0
原创粉丝点击