- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在读取一些带有冰岛字母的 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/
我是一名优秀的程序员,十分优秀!