getID3的注意事項與圖檔檢查範例

上次介紹如何使用getID3來檢查使用者上傳的圖檔。判斷方式雖然簡單…不過,個人在使用上覺得有些事情要稍微注意。針對傳回的array以及我在讀取mp3內的中文tag時遇到的狀況做說明。最後並附上測試項目的結果…

array structure
getID3範例 - demo.basic.php的程式碼中,最後有一段程式和程式註解,節錄如下…
  1. /* 
  2.  Optional: copies data from all subarrays of [tags] into [comments] so 
  3.  metadata is all available in one location for all tag formats 
  4.  metainformation is always available under [tags] even if this is not called 
  5. */  
  6. getid3_lib::CopyTagsToComments($ThisFileInfo);  
當下,並不太懂他真正的含意。不過,後來因為要瞭解getID3傳回的array結構,於是翻了一下內附的說明文件structure.txt。發現裡面有如下的解釋,就比較能瞭解了...
If you want to merge all available tags (for example, ID3v2 + ID3v1) into one array, you can call getid3_lib::CopyTagsToComments($ThisFileInfo) and you'll then have ['comments'] and ['comments_html'] which are identical to ['tags'] and ['tags_html'] except the array is one dimension shorter (no tag type array keys). For example, artist is: ['tags_html']['id3v1']['artist'][0] or ['comments_html']['artist'][0]
附註:在測試時,我發現他的變數名稱定義似乎有點問題。在讀取不同的檔案時,有看過 ['title'],有的卻是['Title']。


中文問題
getID3可以讀取mp3內的ID3資訊(ID3v2 & ID3v1)。如果,您的mp3檔案中的ID3資訊是中文時,採用預設值(ISO-8859-1)讀取,將會得到亂碼。

翻了一下getID3的code,裡面有定義各種檔案、欄位所採用的編碼。其中,他提供兩個設定讓呼叫者改變。

以我測試用的mp3檔案為例,裡面的中文字是big5編碼。因此,我加上下列的處理後,讀出來的中文就正常了。(當然,要看您檔案內的編碼做調整)
  1. $getID3->encoding='UTF-8';       //請依照自己檔案條件修改  
  2. $getID3->encoding_id3v1='BIG-5'//請依照自己檔案條件修改  
附註:如果您的環境是unix-like,mp3檔案又是中文檔案時,請記得先做好OS的編碼設定。

最後,附上一張以getID3所附的範例程式 - demo.browse.php ,讀取用來測試之用的檔案結果。

由上而下的五個檔案,分別測試的項目和結果為…
  1. png圖檔,但是亂改binary。
    結果出現warning 
  2. 正常png圖檔。
  3. 利用愛的機器,動過手腳後的png圖檔。
    結果出現warning 
  4. 假冒png圖檔的zip(將.zip改名成.png)。
    結果被判斷出檔案為.zip 
  5. 檔名為中文的mp3檔案。
    因為沒做上述的設定,將ID3v1編碼改為big5,因此變成亂碼。
    ID3v2因為內定採用UTF8,所以沒問題

留言