gpt4 book ai didi

python - 诱变剂和 id3 标签 - 字符编码困惑

转载 作者:太空宇宙 更新时间:2023-11-03 19:28:25 30 4
gpt4 key购买 nike

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

提前致谢。

最佳答案

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

在此步骤中:

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

关于python - 诱变剂和 id3 标签 - 字符编码困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7218324/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com