解決php使用ZipArchive解壓時中文亂碼問題
阿新 • • 發佈:2020-11-03
使用php自帶的ZipArchive來解壓帶中文檔名壓縮包時會造成亂碼,現象如下:
原結構:
解壓程式碼:
$zip = new \ZipArchive(); $res = $zip->open('./錢學森班.zip'); if ($res !== true){ throw new \Exception('開啟壓縮包失敗'); } $zip->extractTo('./cache'); $zip->close();
解壓後:
原因
預設windows,mac打壓縮包時編碼為簡體中文,解壓時未作檔案轉化導致解壓結果與預期不符
解決方法
開啟壓縮包後先將內部檔名及目錄進行轉碼,轉碼後需關閉壓縮包並重新開啟解壓
實現如下:
$zipName = './錢學森班.zip'; $zip = new \ZipArchive(); $res = $zip->open($zipName); if ($res !== true){ throw new \Exception('開啟壓縮包失敗'); } // 加入此段↓ $fileNum = $zip->numFiles; for ($i = 0; $i < $fileNum; $i++) { $statInfo = $zip->statIndex($i, ZipArchive::FL_ENC_RAW); $zip->renameIndex($i, iconv('GBK', 'utf-8//IGNORE', $statInfo['name'])); } $zip->close(); $zip->open($zipName); // 截至↑ $zip->extractTo($extractTo); $zip->close();
注意事項
- 轉碼後因為修改了原壓縮包檔案,所以不可重複轉碼,若不想對原檔案產生影響需先複製(php-zip擴充套件是自己讀檔案流,不需要複製)
- 轉換前使用mb_detect_encoding進行編碼判斷依然是返回UTF-8