Lösung für verstümmelte Zeichen bei der PHP-Zip-Dekomprimierung: Transkodieren Sie zuerst den chinesischen komprimierten Paketnamen mit der Funktion iconv, verarbeiten Sie dann die ZIP-Datei über das ZipArchive-Objekt und schließen Sie schließlich die verarbeitete ZIP-Datei.
Empfohlen: „PHP-Video-Tutorial“
Die Testumgebung ist Windows7
Der chinesische Zip-Paketname und der chinesische Dateiname führen dazu, dass PHPs natives ZipArchive verstümmelt wird, was zu extractTo führt Die Methode schlägt fehl:
<?php $zip = new \ZipArchive; $zipfile = "./test.zip"; $res = $zip->open($zipfile); $toDir = "./test"; $s = $zip->extractTo($toDir); print_r(scandir($toDir)); //作者:Dorm_Script //链接:http://www.jianshu.com/p/3efa924fd809
Siehe einen Blog, die ursprüngliche Lösung lautet:
<?php $zip = new \ZipArchive; $zipfile = "./test.zip"; $res = $zip->open($zipfile); $toDir = "./test"; if(!file_exists($toDir)) { mkdir($toDir); } $docnum = $zip->numFiles; for($i = 0; $i < $docnum; $i++) { $statInfo = $zip->statIndex($i); if($statInfo['crc'] == 0) { //新建目录 mkdir($toDir.'/'.substr($statInfo['name'], 0,-1)); } else { //拷贝文件 copy('zip://'.$zipfile.'#'.$statInfo['name'], $toDir.'/'.$statInfo['name']); } } print_r(scandir($toDir)); //作者:Dorm_Script //链接:http://www.jianshu.com/p/3efa924fd809
Aber wenn $zipfile eine chinesische Kodierung hat, das heißt, wenn der Name des komprimierten Pakets chinesisch ist, Die Dekomprimierung wird immer noch fehlschlagen.
Zu diesem Zeitpunktverwenden Sie die iconv-Funktion, um den chinesischen komprimierten Paketnamen separat zu transkodieren und ihn dann zu verwenden:
//zip文件名 $fileName = '中文.zip'; //zip文件相对服务器根目录的保存路径 $uploads_dir = "/Public/zipUpload"; //zip文件完整的保存路径 $zipName = $_SERVER['DOCUMENT_ROOT'].$uploads_dir.'/'.$fileName; //将目标路径名称赋值为fileName最后的'.zip'四个字符之外的全部字符构成的字符串 $toDir = $_SERVER['DOCUMENT_ROOT'].$uploads_dir.'/'.substr($fileName,0,strlen($fileName)-4); $zip = new \ZipArchive;//新建一个ZipArchive的对象 /* 通过ZipArchive的对象处理zip文件 $zip->open这个方法的参数表示处理的zip文件名。 如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE */ $res = $zip->open(iconv ( 'UTF-8', 'GB2312', $zipName)); if ($res === TRUE){ if (!is_dir(iconv ( 'UTF-8', 'GB2312', $toDir))) { mkdir(iconv ( 'UTF-8', 'GB2312', $toDir), 0777, true); } //$zip->extractTo($toDir); $docnum = $zip->numFiles; for($i = 0; $i < $docnum; $i++) { $statInfo = $zip->statIndex($i); if($statInfo['crc'] == 0) { //新建目录 mkdir(iconv ( 'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name']), 0777, true); } else { //拷贝文件,特别的改动,iconv的位置决定copy能不能work if(copy('zip://'.iconv ( 'UTF-8', 'GB2312', $zipName).'#'.$statInfo['name'], iconv ( 'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name'])) == false){ echo 'faild to copy'; } } } print_r(scandir(iconv ( 'UTF-8', 'GB2312',$toDir))); $zip->close();//关闭处理的zip文件 } else{ echo 'failed, code:'.$res.'<br>'; }
上述代码的输出:
Array ( [0] => . [1] => .. [2] => �� [3] => Ҫ )
压缩包的目录:
中文.zip ├── 不 │ └── 要 │ └── dance.txt └── 要 └── dance1.txt
Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem verstümmelter Zeichen bei der PHP-Zip-Dekomprimierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!