這篇文章給大家分享的是有關php壓縮中文文件名亂碼怎么辦的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
php壓縮中文文件名亂碼的解決辦法:首先將中文壓縮包名用iconv函數轉碼;然后通過ZipArchive的對象處理zip文件即可。
本文操作環境:Windows10系統、PHP7.1版,DELL G3電腦
PHP解壓ZIP壓縮包,解決中文亂碼問題
修復原生ZipArchive的中文亂碼問題
中文的zip壓縮包名和中文的文件名會導致PHP原生自帶的ZipArchive亂碼,導致extractTo方法失效:
<?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
參考一篇blog,原作的解決辦法是:
<?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
但是當$zipfile是中文編碼時,也就是壓縮包的名稱是中文時,解壓仍然會失敗。
此時單獨再將中文壓縮包名用iconv函數轉碼后再使用:
//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
感謝各位的閱讀!關于“php壓縮中文文件名亂碼怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。