2012-12-16 20 views
1

我正在寫一個小的perl腳本來根據文件名重新標記我的MP3集合。MP3 :: Tag - UTF-16無法識別的BOM

#!/usr/bin/perl 

use strict; 
use warnings; 
use MP3::Tag; 
use File::Find; 

MP3::Tag->config(write_v24 => 1); 
my $dirpath = "../MP3s/"; 
finddepth(\&wanted, $dirpath); 
sub wanted { 
    unless (-d $_) { 
     my ($track,$artist,$title); 
     if(($track,$artist,$title) = ($_ =~ m/(\d+) - (.+?) - (.+)\.mp3$/g)){ 
      #handle songs with a track number 
      my $mp3 = MP3::Tag->new($_) or die $!; 

      $mp3->track_set($track); 
      $mp3->artist_set($artist); 
      $mp3->title_set($title); 
      $File::Find::dir =~ m/.*\/(.*)/; 
      $mp3->album_set($1); 
      $mp3->update_tags(); 
      $mp3->close(); 
      print "$track - $artist - $title\n"; 
     } elsif(($artist,$title) = ($_ =~ m/(.+?) - (.+)\.mp3$/g)){ 
      #handle songs without a track number 
      my $mp3 = MP3::Tag->new($_) or die $!; 

      $mp3->track_set(""); 
      $mp3->artist_set($artist); 
      $mp3->title_set($title); 
      $mp3->update_tags(); 
      $mp3->close(); 
      print "$artist - $title\n"; 
     } 
    } 
} 

這工作得很好,但也有一些文件,這使腳本崩潰,出現此錯誤: UTF-16:Unrecognised BOM 3100 at C:/strawberry/perl/lib/Encode.pm line 175.

是什麼原因導致這個錯誤?文件名沒有像德國變音符號這樣的特殊字符(ä,ö,ü)。

如何解決此問題或跳過此類文件?

+0

不完整的答案:有東西傳遞了一個字符串,它沒有以BOM開頭來「解碼」UTF-16「'。由於'decode'無法知道字符串是否使用UTF-16le或UTF-16be編碼,因此您必須指定確切的編碼。 – ikegami

回答

3

您應該首先添加use Carp::Always,這會給您一個堆棧跟蹤,顯示您在自己的程序中哪個語句是致命的。

+0

這顯示了在mp3tag.pl第11行調用的File :: Find :: finddepth('CODE(0x29830e0)','../MP3s/')的堆棧跟蹤,但沒有進一步顯示。但它是一個整潔的模塊。 – Demnogonis

+0

@Demnogonis:然後你必須用空的存根替換你想要的子例程,並開始添加它,直到你重現異常。 – Borodin

+0

好的,我轉載了它。看來,由於文件編碼不正確,MP3 :: Tag無法設置標籤。有沒有比'eval {}'更好的方法來跳過這些文件? – Demnogonis