mutagen和id3标签 - 字符编码混淆

时间:2011-08-28 00:43:00

标签: python character-encoding id3 mutagen

我在用冰岛字母读取一些id3标签时遇到了问题 来自shell的快速​​示例。

>>> audio = mutagen.easyid3.EasyID3('./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3')
>>> audio['title']
5: [u'Gling-Gl\xf3']

首先,我不确定如何检查标签所在的字符编码。从我收集的信息来看,这是使用mutagen进行编码的方法:

>>> audio = mutagen.id3.ID3('./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3')
>>> for key, value in audio.items():
...     print value.encoding

每个项目输出“0”。

我看到某处对于id3标签,数字0意味着字符串是iso-8859-1编码,但我不知道从那里去哪里。我想这不对吗?

>>> audio.get('artist')[0].decode('iso-8859-1')
14: u'Bj\xc3\xb6rk'

正如你可以告诉我的那样,在字符编码问题上我很困惑 我想要的只是将标签捕获为正确的utf-8字符串,以便将它们放入我的数据库中。 这只是一个例子,我想我可能会遇到一些编码完全不同的其他文件,所以我正在寻找一个好的解决方案。解决这个问题确实可以帮助我顺利进入轨道。

提前致谢。

2 个答案:

答案 0 :(得分:1)

欢迎来到有趣的编码世界。

在此步骤中:

>>> audio = mutagen.easyid3.EasyID3('./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3')
>>> audio['title']
[u'Gling-Gl\xf3']

...最终得到一个unicode字节串。在第二行中,Python打印出该字节字符串的ASCII重新定位,这就是您看到十六进制值的原因。你需要的是Python使用一个可用的字符编码来获取该字节串并编码它。这对我来说也是一个混乱的根源。请记住,您将字符解码为十六进制值,并将十六进制值编码为字符。

所以,如果你这样做:

In [1]: s = u'./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3'

In [2]: s
Out[2]: u'./Bj\xf6rk/Albums/1990 - Gling-Gl\xf3 [mp3-231]/01 - Gling-Gl\xf3.mp3'

In [3]: s.encode('UTF-8')
Out[3]: './Bj\xc3\xb6rk/Albums/1990 - Gling-Gl\xc3\xb3 [mp3-231]/01 - Gling-Gl\xc3\xb3.mp3'

嗯,这太烦人了。你告诉它用UTF-8编码,但你仍然有ASCII。诀窍是在Python中进行这样的调用只输出任何输入的ASCII表示。如果您将其更改为:

In [4]: print s.encode('UTF-8')
./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3

...你看到了正确的结果。因此,一旦您实际使用新编码的文本执行某些操作,您将看到它代表您想要的方式。将其打印到控制台,将其写入文件或在GUI小部件中显示应该看起来不错。

答案 1 :(得分:0)

if len(Genre)>0:
    MyGenre = u' '
    MyGenre = Genre
    audio.add(TCON(encoding=3, text=MyGenre))
audio.save()

这对我有用