星期四, 八月 17, 2006

不是办法的办法

Gnome中国的Xin Zhen曾试图向gstreamer提交识别MP3 id3tag多语言编码的补丁:

Rhythmbox 的用户可能会发现,自己硬盘上的 mp3 有很大一部分其中中文的 tag 被显示为乱码。当然仍然有一小部分是正常的。 对这个问题进行分析后我们发现,问题出在 gstreamer,以及它调用的库 libid3tag 上。

在分析 rhythmbox 显示中文 mp3 标记乱码的问题后,我们意识到这是一个 gstreamer 的问题。gstreamer 向 rhythmbox 提供了与乐曲格式无关的、Unicode 编码的标准化格式的标记信息。

……

当 id3v2 规范发布,并规定其中的字符串编码必须是 iso-8859 或者 unicode 时,已经太晚了,满世界的 mp3 都已经在 iso-8859 字段中填写了各类本地编码字符串。

……

不幸的是 libid3tag 的作者显然并不生活在非西文地区。它忠实地执行了 id3v2 规范的内容:将 iso-8859 字段中的文字精确地按照 iso-8859->unicode 的方式进行转换,并向 gstreamer 提交 unicode 字符串。这样,存储在 iso-8859 字段中的一个中文字符就被编码成了2个 Unicode 字符。对其进行显示的结果,就是乱码。

在此似乎也无法苛责 libid3tag,毕竟它是根据规范而为。因此我选择了对 gstreamer-mad 打补丁,使其正确地按照当前系统所处的 locale,对存储在 iso-8859 字段中的字符串进行 unicode 转换。这样,当你的 locale 为中文时,就能通过 rhythmbox 正确看到中文 mp3 歌曲中的标记信息。




不过,我觉得这样并不是一个一劳永逸的好办法。最好的办法还是把MP3的id3v1的信息永久的转换为utf-8。相对而言,根据locale判断编码,很可能在euc-cn/utf-8之间判断错误,而且谁也不能保证一个中文locale的用户不听日文、希伯来文、俄文的歌曲,而其中包含的id3编码,又有谁清楚呢?

最好的办法还是建立标准的id3/cd数据库,通过网络的访问,确定正确的名称,艺术家等等。

没有评论: