3

我在 Zip 文件夹中的文件名是“Norge språ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();                   
}

任何人都请在这个问题上帮助我。

4

1 回答 1

2

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

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

因此,您唯一可以肯定使用的是 7 位 ASCII。但是由于 ISO-Latin-1 代码表被广泛使用(并且包含所有斯堪的纳维亚特殊字符),您面临的问题也往往是由自动转换引起的,因为在您自己的计算机上键入的文件名不应该导致再次在那里显示时有什么不同。

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

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

使用 CP852 作为您的字符(其他编码)或编码或使用

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

要查看真正的问题,请阅读php zip 内容编码

于 2013-03-05T09:33:10.600 回答