php字符串压缩 乱码,如何解决php zip解压乱码的问题

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

f8b235f3281c4cd8ec35b2e1661e8413.png

测试环境是windows7

中文的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.'
';

}

上述代码的输出:Array

(

[0] => .

[1] => ..

[2] => ��

[3] => Ҫ

)

压缩包的目录:中文.zip

├── 不

│ └── 要

│ └── dance.txt

└── 要

└── dance1.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值