一个软件,微软通常需要经历四、五代,才会搞对
这是前几天在一个 podcast 中听到美国几个 IT 前辈的观点。我当下脑中立刻发出“一针见血”的反射动作,这两天更是遇上一个活生生的例子,始作俑者的现行犯是 Windows Media Player。
一位同事最近买了 Macbook,故需要将一些 MP3 从 XP 迁移到 Mac OS 10.5 上的 iTune,其中包括一些过去用 Media Player 从原始 Audio CD 剥下来的中文和日文歌。当这些 MP3 被导入 Mac 上的 iTune 时,他发现里面出现了大量的乱码,而大部分都集中在中、日文歌曲。于是找我求助。
我们知道,MP3 等多媒体文档的元数据(如歌名、演唱者、专辑名等),是存放在 ID3 标签里面的。可能是因为我不爱用 Media Player(觉得界面很不直觉),自己过去对处理这个问题还真的没经验。替他诊断了一下后,发现这些 MP3 的 ID3 标签中的文字,都是以简体中文 CP936, GB2312 的编码形式存在,而未采用多语言支持更好的 Unicode (UTF-8)。这就有趣了。在 ID3 文字编码的处理上,Windows Media Player 的做法,不同于其他 MP3 音乐播放器,如 iTune 或 Linux 上的各播放器。人家都是选择用 Unicode,但微软则独排众议地选择用本地的语言,所以在不同语言的 OS 下做,会出来不同的结果 — 简体中文会是 CP936,繁体中文则 CP937…。微软早在 NT 和 Office 2000 时代便已支持 Unicode,为何 Media Player 不采用真是匪夷所思。
我知道可以用 perl 等脚本语言写一个转码的 script,因为有现成的 ID3 library 模块,所以开发起来很方便。过去我为了要处理一些没有 ID3 的老 MP3,把文档和目录名中的歌名、演唱者、专辑名等信息,批量写入新生成的 ID3 标签,就曾写过一个 Perl script。上网搜了一下,果然已经有人写好了 — Google Code 上有一个叫 mp3-tag-iconv 的 perl script,这是一个华人网友写的。此外,发现有一个泰国网友在 Linux 上有同样的问题,他推荐一个 sourceforge 上某俄国网友写的 Python 脚本 tag2utf (看来,这个问题至少中、泰、俄文的用户都遇到了)。兴冲冲地开始拿一个王菲的歌,用 mp3-tag-iconv 来测,没想到遇到一个 bug。反映给作者后,短短两个小时内,竟然就上传了新版。这次没问题了,感谢!能成功地将 test.mp3 中的标签文字从 cp936/GB2312 转为 UTF-8。我是在 Cygwin (一套提供 Unix 命令列工具的环境)底下操作该 perl script。
事实上,如果要用这些 scripts 来做批量转换,还可能遇到其他的挑战 — 因为不只是 ID3 元数据,就连文档名和目录名,都是用歌名、演唱者、专辑名来命名的,而 Unix 命令列环境最怕遇到非 ASCII 的文档、目录名,而好死不死这些 MP3 的文档、目录名,不但充满了中文,而且还有用中文 codepage 去编码的非 ASCII 西文字元(如 Joaquín 中的 í),和日文平假名、片假名,这恐怕够呛…。
我 cd 到要转换的根目录,然后下:
find . -type f -name ‘*.mp3′ -exec mp3_tag_iconv-0.9c.pl -f cp936 {} \;
果然,有十几个文档名,Cygwin 无法处理,导致转换失败,但已经可以偷笑的是,这个方法对 95% 以上的文档都 work。
分别找出了哪些档名有问题的,发现一个有趣的现象 — 只要是中文的,都没问题,有问题的都是那些日文歌,还有一两个西文的。这似乎意味着,只要是和 OS 本地编码配置一致的(中文),Cygwin 就 OK,否则,如果是那些违反自然,在中文系统下硬编成日文的档名,则会有问题。
没什么其他好方法了,幸亏有问题的只有十几个。于是使用低科技的解决方法,将它们一一改名为 ASCII 文档、目录名,重新执行转换命令。终于结束了一场 Media Player 带来的灾难。
很久没去升级 Media Player 了,不知道最新版针对 ID3 编码的问题上,是否已经改进。已经换了好几代了,也该是搞对的时候了吧!
附带一提:分享一个好东西 — 讲究音质的网友,如果要将 audio CD 上的音乐转成 MP3,千万别用 iTune 或 Media Player(如果上述的经历还不足以让您抛弃它)。在此推荐 LAME (唯一的缺点是转换速度较慢,因为演算法较为复杂)。针对 iTune 转 MP3 音质不佳,有一种个阴谋论 (conspiracy theory) 的猜测是,iTune 里面故意要把 MP3 编码模组做烂一点,相较之下,如果选择用苹果独家的 AAC (m4a) 格式,则音质好得多,这么做是鼓励用户尽量采用方便他们锁定用户的 AAC 格式 。
LAME 的名字也超酷 — LAME Ain’t an Mp3 Encoder,连名称缩写都玩递归,让我想起 GNU — GNU is Not Unix。不只如此,lame 的英文原意为 “跛” 或 “拙劣“,似乎命名者又有点自我解嘲或谦虚的味道。