【发布时间】:2012-12-16 20:22:55
【问题描述】:
我正在编写一个小的 perl 脚本来根据文件名重新标记我的 MP3 收藏。
#!/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.
是什么导致了这个错误?文件名没有特殊字符,如德语变音符号 (ä,ö,ü)。
如何解决此问题或跳过此类文件?
【问题讨论】:
-
不完整的答案:某些东西将一个不以 BOM 开头的字符串传递给
decode "UTF-16"。由于decode无法知道字符串是使用 UTF-16le 还是 UTF-16be 编码而没有 BOM,因此您必须指定确切的编码。