PHP ZipArchive 中文乱码的原因及解决方法

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

使用道具 举报

手机版|轻松E站

返回顶部 返回列表