关于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.

<?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压缩,查看目录,中文乱码那些事

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册