在php中使用ZipArchive提取zip文件夹时出现特殊字符问题

时间:2013-03-05 08:56:14

标签: php cakephp ziparchive

我在Zip文件夹中的文件名是“Norgespråk.pdf”,在解压缩zip文件夹时,我得到的文件名为“Norge spr†k.pdf”。

zip = new ZipArchive;
if ($zip->open($path, ZIPARCHIVE::CREATE) === true) 
{
    if(!file_exists(WWW_ROOT."/excel/".$name))
    {
        mkdir(WWW_ROOT."/excel/".$name, 0777);
    }
    for($i = 0; $i < $zip->numFiles; $i++) 
    {
        $fileinfo = pathinfo($zip->getNameIndex($i, ZIPARCHIVE::FL_UNCHANGED));

        copy("zip://".$path."#".htmlentities($test, ENT_COMPAT, 'ISO-8859-1'), WWW_ROOT."/excel/".$name.'/'.htmlentities($fileinfo['basename'], ENT_COMPAT, 'ISO-8859-1'));
    }                   
    $zip->close();                   
}

任何人都可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

我不知道Cake PHP,但真正的问题是ZIP。问题是压缩文件的数据不应该被视为二进制数据。这可能源于您自己的文件/变量处理。 php是松散类型的,这意味着php引擎自动选择变量的类型。

另一件事是文件名的处理。这些名称是字符数据,并存储在zip文件中,没有关于编码的信息。

所以你唯一能用的就是7-Bit-ASCII。但是,由于ISO-Latin-1代码表广泛使用(并包含所有斯堪的纳维亚语特殊字符),因此您遇到的问题往往是由自动转换引起的,因为您自己键入了文件名 计算机在再次显示时不应导致任何差异。

提供解决方案的解决方案:

 $zip->addFile($file_data['path'], iconv("UTF-8","CP852",$file_name));

使用CP852作为角色(other encoding)或编码或使用

 system('unzip -o ' . $file);

要查看真正的问题,请阅读php zip contents encoding