我在用冰岛字母读取一些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字符串,以便将它们放入我的数据库中。 这只是一个例子,我想我可能会遇到一些编码完全不同的其他文件,所以我正在寻找一个好的解决方案。解决这个问题确实可以帮助我顺利进入轨道。
提前致谢。
答案 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()