【问题标题】:MP3::Tag - UTF-16 unrecognized BOMMP3::Tag - UTF-16 无法识别的 BOM
【发布时间】: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,因此您必须指定确切的编码。

标签: perl encoding mp3


【解决方案1】:

您应该首先添加use Carp::Always,这将为您提供堆栈跟踪,显示您自己程序中的哪个语句是致命的。

【讨论】:

  • 这显示堆栈跟踪到File::Find::finddepth('CODE(0x29830e0)', '../MP3s/') called at mp3tag.pl line 11,但没有进一步。但它是一个简洁的模块。
  • @Demnogonis: 然后你必须用一个空的存根替换你的wanted 子例程并开始添加它直到你重现异常。
  • 好的,我转载了。由于文件编码错误,似乎 MP3::Tag 无法设置标签。有没有比eval{} 更好的方法来跳过这些文件?
  • 所以它在MP3::Tag->new 上崩溃了? eval 是唯一的方法,除非模块中专门为此内置了一些东西,或者您可以事先以其他方式检查文件的有效性。我强烈建议您使用Try::Tiny 模块对eval 的封装,否则建立错误条件会变得非常混乱。
猜你喜欢
  • 2015-07-14
  • 2014-02-11
  • 2011-01-23
  • 2023-03-24
  • 2012-02-08
  • 1970-01-01
  • 2011-07-21
  • 2014-04-22
  • 1970-01-01
相关资源
最近更新 更多