php压缩文件名乱码,关于PHP压缩,查看目录,中文乱码那些事

今天农成在加班写一个关于学校的管理系统的时候呢,就遇到了几个比较蛋疼的问题。

1、使用PHPword生成word文档的时候呢,就遇到了中文文件名字生成的问题。

解决办法:

$name = iconv('utf-8', 'GB2312//IGNORE', $teacher['name']).'.doc';

$document->save($save_path.'/'.$name);

完美解决。

2、使用PHPzip生成压缩文件的时候,发现压缩不进刚刚生成的中文命名的文档。

打断点跟进了一下这个问题。发现产生的原因有以下几个:

a、使用递归函数遍历文件夹下面的文件的时候,出现了文件漏掉的情况。代码如下:

//获取文件列表

private function list_dir($dir){

$result = array();

if (is_dir($dir)){

$file_dir = scandir($dir);

foreach($file_dir as $file){

$file = iconv('gbk', 'utf-8', $file) ;//这里就是产生漏掉的原因。

if ($file == '.' || $file == '..'){

continue;

}

elseif (is_dir($dir.$file)){

$result = array_merge($result, $this->list_dir($dir.$file.'/'));

}

else{

array_push($result, $dir.$file);

}

}

}

return $result;

}

b、在使用$zip = new ZipArchive;进行压缩的时候,发现中文名字的文件根本就压缩不进去。于是借助了万能的百度和谷歌,通过查看zip的文档。文档地址。发现了以下的问题:

如果文件名包含汉字,ZIPARCHIVE::addFile() 会导致无法将文件压缩到压缩包中,或者压缩以后文件名乱码。

可以使用ZipArchive::addFromString()来实现。

注意:如果操作系统是Windows,文件系统编码是gbk.

如果php文件的文件编码是utf-8,需要相应转码。

ZipArchive::addFile() fails if the filename contains Chinese characters.

ZipArchive::addFromString() should be used instead.

$z= newZipArchive;$file='吴先成.txt';

if($z->open(ZIPARCHIVE::CREATE)===true){$z->addFromString($file,file_get_contents($file));//for windows

//$z->addFromString($file, file_get_contents(iconv('utf-8', 'gbk//ignore', $file)));}// ...

然后就使用以下代码:

//重新生成文件

$zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释

if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {

exit('无法打开文件,或者文件创建失败');

}

foreach($datalist as $val){

if(file_exists(iconv('UTF-8','GB2312', $val))){

// $zip->addFile( $val, basename($val));//非中文使用这个

$zip->addFromString(iconv('UTF-8','GB2312', $this->get_basename($val)), file_get_contents(iconv('utf-8', 'gbk//ignore', $val)));//中文使用这个

}

}

$zip->close();//关闭

完成了整个从生成word到压缩下载的曲折过程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值