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
- PHP解压ZIP压缩包,解决中文乱码问题
- Java实现Zip压缩与解压(解决中文乱码问题)
- Java实现Zip压缩与解压(解决中文乱码问题)
- zip压缩包解压乱码问题
- 解决ubuntu下使用界面解压zip压缩包乱码
- PHP中文件压缩为Zip包及专门解压Zip包的类文件
- 完美解决java生成或解压zip包乱码问题
- 解决ubuntu中zip解压的中文乱码问题
- ubuntu 解决zip解压出现中文乱码问题
- Ubuntu中解决解压zip文件中文乱码问题
- 解决ubuntu中zip解压的中文乱码问题
- ubuntu下解决解压zip文件中文文件名乱码问题
- JAVA解压zip包中文乱码
- Ubuntu16.04解压zip包中文乱码
- 关于ZIP压缩问题 解决中文文件名乱码
- Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)
- 解压rar和zip(解决中文乱码)
- ubuntu解压zip文件中文乱码问题
- hdu1530-回溯&最大团&菜鸟算法笔记-Maximum Clique
- 【BigHereo 22】---DataStructure---宏观理论(一)
- go 中 make 与 new 的区别
- First, rewinding head to replay your work on top of it...
- UVAlive7040(组合数,容斥原理,逆元)
- PHP解压ZIP压缩包,解决中文乱码问题
- 汇编实现字符串大小写转换
- No qualifying bean of type 'com.funo.oa.dao.PostDao' available问题解决:找不到dao的实现类
- flume sink到hdfs第一列是时间戳,怎么去掉
- 关于对 React 生命周期方法的详解
- 把spring boot项目打war包放在tomcat下启动报错java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManage
- 为MATLAB添加深度学习工具箱
- Java中MyEclipse快捷键整理
- 求质心