大家好

最近遇到一個神奇的問題
假設我有一個壓縮檔案
裡面放一些中文檔名檔案
例如
澳洲麥片.pdf
澳大利亞麥片.pdf
 
直接使用預設的解壓縮方式
例如以下方式:
 
//原本解壓縮方式
$zip = new ZipArchive;
$res = $zip->open($zipFile);
if ($res === TRUE) {
    $zip->extractTo($dir);
    $zip->close();
}
 
就變成
D洲麥片.pdf
U大利亞麥片.pdf
 
類似這種情況
開頭文字消失且有亂碼
查看解出來的檔案也確實開頭已經是英文了...
所以我有找到另一種針對中文檔名的解壓縮方式:
 
//解壓縮到 TMP
//打開ZIP
$zip = zip_open($zipFile);
//讀取ZIP
while ($zip_entry = zip_read($zip)) {
    //取得ZIP內檔案名稱
    $zfname = zip_entry_name($zip_entry);
    //打開ZIP內檔案資源
    if (zip_entry_open($zip, $zip_entry)) {
        //讀取ZIP內檔案資源 記得要設定大小 zip_entry_filesize($zip_entry)
        $contents = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
        //寫入檔案到轉換為 UTF8檔案名稱的檔案 用 mb_convert_encoding轉換
        file_put_contents($dir.mb_convert_encoding($zfname, "utf-8", "big5"), $contents);
        //關閉ZIP內檔案資源
        zip_entry_close($zip_entry);
    }
}
zip_close($zip);
 
這邊主要是使用 zip_read 方式
一個一個的處理檔案
如果遇到中文檔名
且 需要正確的保留中文檔名的時候
就需要這樣做了
給大家參考囉