今天农成在加班写一个关于学校的管理系统的时候呢,就遇到了几个比较蛋疼的问题。
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. <?php $z = new ZipArchive; $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到压缩下载的曲折过程。
未经允许不得转载:微信信息发源地 » 关于PHP压缩,查看目录,中文乱码那些事
评论前必须登录!
登陆 注册