2013-03-05 76 views
2

我的Zip文件夹中的文件名是“Norgespråk.pdf”,并且在解压zip文件夹时,我将文件名称命名为“Norge spr†k.pdf ”。使用ZipArchive在php中提取zip文件夹时出现的特殊字符

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

我相信在Stack Overflow上有一个重复的问题。不停寻找。 – 2013-03-05 09:16:30

+0

请参阅http://stackoverflow.com/questions/13267143/php-zip-contents-encoding – 2013-03-05 09:18:22

回答

2

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

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

所以你唯一可以肯定使用的是7位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

+0

谢谢,第二种解决方案适用于我。 – 2013-03-05 13:41:38

+0

@VineelaYarlagadda如果您的解决方案有效然后请接受答案并为其投票 – Vineet1982 2013-03-05 13:43:09