最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

如何解决php zip解压乱码的问题

来源:动视网 责编:小采 时间:2020-11-02 18:26:46
文档

如何解决php zip解压乱码的问题

如何解决php zip解压乱码的问题:php zip解压乱码的解决办法:首先将中文压缩包名用iconv函数转码;然后通过ZipArchive的对象处理zip文件;最后关闭处理的zip文件即可。推荐:《PHP视频教程》测试环境是windows7中文的zip压缩包名和中文的文件名会导致PHP原生自带的ZipArchive乱
推荐度:
导读如何解决php zip解压乱码的问题:php zip解压乱码的解决办法:首先将中文压缩包名用iconv函数转码;然后通过ZipArchive的对象处理zip文件;最后关闭处理的zip文件即可。推荐:《PHP视频教程》测试环境是windows7中文的zip压缩包名和中文的文件名会导致PHP原生自带的ZipArchive乱


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

推荐:《PHP视频教程》

测试环境是windows7

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

<?php
$zip = new ipArchive;
$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 ipArchive;
$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 ipArchive;//新建一个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 zip解压乱码的问题

如何解决php zip解压乱码的问题:php zip解压乱码的解决办法:首先将中文压缩包名用iconv函数转码;然后通过ZipArchive的对象处理zip文件;最后关闭处理的zip文件即可。推荐:《PHP视频教程》测试环境是windows7中文的zip压缩包名和中文的文件名会导致PHP原生自带的ZipArchive乱
推荐度:
标签: 解压 压缩包 乱码
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top