我在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();
}
任何人都可以帮我解决这个问题。
答案 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