1

我在阅读一些带有冰岛字母的 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']

首先,我不确定如何检查标签所在的字符编码。根据我收集到的信息,这是使用诱变剂的方法:

>>> 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 字符串,以便我可以将它们放入我的数据库中。这只是一个例子,我想我可能会遇到其他一些编码完全不同的文件,所以我正在寻找一个好的全方位解决方案。只是解决这个问题真的会帮助我走上正轨。

提前致谢。

4

2 回答 2

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 小部件中显示它应该看起来不错。

于 2011-08-28T10:51:42.723 回答
0
if len(Genre)>0:
    MyGenre = u' '
    MyGenre = Genre
    audio.add(TCON(encoding=3, text=MyGenre))
audio.save()

这对我有用

于 2016-04-06T08:27:18.800 回答