1. 程式人生 > 實用技巧 >解決php使用ZipArchive解壓時中文亂碼問題

解決php使用ZipArchive解壓時中文亂碼問題

使用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