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

1 投票
2 回答
2823 浏览
提问于 2025-04-17 00:27

我在读取一些包含冰岛字母的id3标签时遇到了问题。
这里有个简单的例子来自命令行。

>>> 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
if len(Genre)>0:
    MyGenre = u' '
    MyGenre = Genre
    audio.add(TCON(encoding=3, text=MyGenre))
audio.save()

这对我来说是有效的

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

...你就能看到正确的结果。所以,一旦你对新编码的文本做了什么,你会看到它以你想要的方式呈现。无论是打印到控制台、写入文件,还是在图形界面小部件中显示,效果都应该很好。

撰写回答