孤島日誌

2005年九月,一個不想認真寫、卻想認真生活的部落格
2009年六月,iBook不再是iBook
2011年五月,一切未定


汪洋的世界中,我們每個人都是座孤島

星期日, 7月 10, 2011

PCLZIP 壓縮中文檔名

最近幫人寫的一個網站需要壓縮 zip 檔,使用的是 pclzip 這個套件,只需要簡單幾個指令就能壓縮/解壓縮 zip 檔,是很不錯的方案。因為網站編碼是 UTF-8(這個時代誰還在用 Big5 的...),所以存下來的檔名很自然也是以 UTF-8 編碼。在處理的過程中發現,在壓縮帶中文檔名的檔案時,UTF-8 編碼的檔名/目錄名無法在 Windows 下正常解壓。不確定是 pclzip 或是 windows 方面的問題。總之解決方案就是,在壓縮的過程中把 UTF-8 轉成 Big5 編碼。

幸好 pclzip 有提供變更檔案名稱的方法 (News,連結可能會變動)。在 User Guide 裡沒有寫出來,所以花了點時間才找到。我大約的寫法是像這樣:

// 設定解壓後的中文目錄名稱
$big5DirName = iconv('UTF-8', 'Big5', '中文目錄名/');


// 將要下載的檔案轉換為 big5
foreach( $queue as $utf8filename ) {


  if( file_exists($file_hosting_dir.$utf8filename) ) {

  $zipFiles[] = array(
    PCLZIP_ATT_FILE_NAME => $file_hosting_dir.$utf8filename,// 本地檔案路徑
    PCLZIP_ATT_FILE_NEW_FULL_NAME => $big5DirName.iconv('UTF-8', 'Big5', $utf8filename) );// 壓縮檔內路徑+全名

  }

}

// 如果沒資料就停止下載
if( !tep_not_null($zipFiles) ) {
    echo '無可下載檔案。';
    exit;
}

// 建立 pclzip 物件, 並壓縮所有檔案
$archive = new PclZip($zip_tmp_file_path_name);
$v_list = '';
$v_list = $archive->create($downloadFiles);


// 若壓縮失敗,停止下載並顯示錯誤訊息
if ($v_list == 0) {
  die("ERROR : '".$archive->errorInfo(true)."'");
}


...// 輸出表頭下載檔案

沒有留言: