ZipArchive乱码,是因为编码不一致导致的,Windows的文件系统是gbk编码的,而PHP ZipArchive中的文件名是UTF-8编码的。Zip压缩包中如果文件名包含中文等特殊字符,用PHP ZipArchive解压乱码是必然的事情。ZipArchive压缩文件出现乱码或者无法将文件压缩进去,也是相同的道理。要解决ZipArchive乱码,只需要在PHP中变通处理一下,不要用自带的ZipArchive::extractTo()方法去解压ZipArchive文档,改用PHP的zip封装协议解压去解决ZipArchive乱码。
- zip://xc.php.zip#music/she.mp3
复制代码 以上路径表示当前目录中的压缩文档xc.php.zip中的musci目录中的she.mp3文件。
结合PHP自带的copy()函数,即可轻松地将一个压缩文件中的某个文件提取出来保存。
- copy('zip://xc.php.zip#music/she.mp3', 'save/as/she.mp3');
复制代码 当然,我们不可能手动去获取压缩包中的文件名,下面就可以借助ZipArchive类来获取压缩文档的文件。- $z = new ZipArchive;
- $z->open('xc.php.zip');
复制代码 假设以上代码成功地打开了Zip压缩文档。$z->numFiles可以得到压缩包中的文件总数,$statInfo = $z->statIndex($i)可以得到指定索引对应的文件信息,其中$i是文件所在的索引,$statInfo['name']即代表文件名保存在压缩文档中的文件名,这个名字是UTF-8编码的,我们通过iconv()函数将编码转为gbk,然后使用copy()函数倒腾一下,就可以保存指定的文件到硬盘上了,只要循环遍历即可将压缩包中的所有文件全部提取出来。
具体操作较为简单,不再赘述。statIndex()方法返回的数据格式如下所示。
- Array
- (
- [name] => she.mp3
- [index] => 0
- [crc] => -397738270
- [size] => 49805421
- [mtime] => 1463066008
- [comp_size] => 4980524
- [comp_method] => 8
- )
复制代码 |
|