【问题标题】:mutagen and id3 tags - character encoding confusionmutagen 和 id3 标签 - 字符编码混淆
【发布时间】:2011-08-28 00:42:59
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: python character-encoding id3 mutagen


    【解决方案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 获取该字节字符串并使用一种可用的字符编码对其进行 encode。这对我来说也是一个困惑的根源。请记住,您将字符解码为十六进制值,然后将十六进制值编码为字符。

    所以,如果你这样做:

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

    【讨论】:

    • 谢谢。这清除了一些事情。所以我只需要在表示之前用 utf8 对字符串进行编码吗?无论源编码是什么(只要 python 可以解码它),这都能工作吗?
    • 如果你在 Linux 中,我认为阻力最小的路径是假设一切都在 UTF-8 中。如果您不能 100% 确定编码是什么,您可以尝试使用 chardet 模块自动检测编码(请注意,我从未使用过此模块):chardet.feedparser.org
    • (我承认假设一切都在 UTF-8 中是相当草率的)
    【解决方案2】:
    if len(Genre)>0:
        MyGenre = u' '
        MyGenre = Genre
        audio.add(TCON(encoding=3, text=MyGenre))
    audio.save()
    

    这对我有用

    【讨论】:

    • 添加一些解释。
    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 2023-03-18
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多