作者 主題: 請教php處理解壓縮編碼處理問題?  (閱讀 3725 次)

0 會員 與 1 訪客 正在閱讀本文。

huangxianqin

  • 憂鬱的高中生
  • ***
  • 文章數: 129
    • 檢視個人資料
請教php處理解壓縮編碼處理問題?
« 於: 2011-03-07 16:59 »
各位版上前輩好

小弟想請教若開發一支程式負責將上傳壓縮檔解壓在同目錄夾內

而壓縮檔內檔案都是Big5編碼(也有可能從UTF-8編碼環境上傳),那麼由php讀入處理時

是否能預先判斷整個壓縮檔正確編碼做處理呢?

還是我能夠不管編碼,全部重新命名壓縮檔內檔案名稱?

謝謝

oscarhsu

  • 懷疑的國中生
  • **
  • 文章數: 84
  • 性別: 男
    • 檢視個人資料
回覆: 請教php處理解壓縮編碼處理問題?
« 回覆 #1 於: 2011-03-07 17:10 »
我想你只能從副檔名去判斷壓縮格式,然後看檔案開頭有沒有BOM,來判斷是Big5還是utf-8,但是unix格式的utf-8沒有BOM,所以看你的情況囉。
Oscar Hsu

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
回覆: 請教php處理解壓縮編碼處理問題?
« 回覆 #2 於: 2011-03-07 17:37 »
比較麻煩的應該是判斷壓縮檔內檔名編碼的問題..
因為這會關係到解開來在不同編碼的檔案系統是否可以正常存取...

至於檔案內容是什麼編碼那是另外一回事...
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

huangxianqin

  • 憂鬱的高中生
  • ***
  • 文章數: 129
    • 檢視個人資料
回覆: 請教php處理解壓縮編碼處理問題?
« 回覆 #3 於: 2011-03-08 12:19 »
 :)

感謝兩位前輩指教,小弟再嘗試看看怎麼解決判斷內容正確解壓縮...

後續有問題再繼續提問

謝謝回覆

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 請教php處理解壓縮編碼處理問題?
« 回覆 #4 於: 2011-03-08 18:16 »
小弟想請教若開發一支程式負責將上傳壓縮檔解壓在同目錄夾內
而壓縮檔內檔案都是Big5編碼(也有可能從UTF-8編碼環境上傳),那麼由php讀入處理時
是否能預先判斷整個壓縮檔正確編碼做處理呢?
還是我能夠不管編碼,全部重新命名壓縮檔內檔案名稱?

如果只是壓縮檔內檔名編碼問題的話, 可以試試這樣

代碼: [選擇]
<?php
$zip 
zip_open("./phpZip.zip");
if (
$zip) {
  while (
$zipEntry zip_read($zip)) {
    
$file1 zip_entry_name($zipEntry);
    
$file2 mb_check_encoding($file1, &#39;UTF-8&#39;) ? $file1 : iconv("big5", "UTF-8", $file1);
    
echo "file name: {$file1}/{$file2}\n<br>";
  }
  
zip_close($zip);
}
?>

phpZip.zip 內有兩張圖片
第一張檔名是 big5 編碼
第二張是 utf-8 編碼的簡體字

結果:

file name:  �W����Y�ɸ��-01.jpg/上傳壓縮檔解壓-01.jpg
file name: 上传压缩档解压-02.jpg/上传压缩档解压-02.jpg

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 請教php處理解壓縮編碼處理問題?
« 回覆 #5 於: 2011-03-08 18:27 »
改了一下:

代碼: [選擇]
<?php
$zip 
zip_open("./phpZip.zip");
if (
$zip) {
  while (
$zip_entry zip_read($zip)) {
    
$file1 zip_entry_name($zip_entry);
    
$encode mb_detect_encoding($file1, &#39;UTF-8, BIG-5, GB2312&#39;);
    
$file2 = (strtolower($encode) != &#39;utf-8&#39;) ? iconv($encode, "UTF-8", $file1) : $file1;
    
echo "file name: [{$encode}]{$file1}/{$file2}\n<br>";
  }
  
zip_close($zip);
}
?>

mb_detect_encoding() 第二個參數可隨意加入可能會出現的編碼
這樣應該比較有彈性  :D :D