gpt4 book ai didi

python - 使用 Python 和 mutagen 去除 mojibaking

转载 作者:行者123 更新时间:2023-11-28 22:00:50 24 4
gpt4 key购买 nike

我正在使用 mutagen 读取 mojibaked ID3 标签。我的目标是在学习编码和 Python 对其处理的同时修复 mojibake。

我正在处理的文件有一个 ID3v2 标签,我正在查看它的专辑 (TALB) 帧,这是根据编码字节在 TALB ID3 框架中,以 Latin-1 (ISO-8859-1) 编码。但是,我知道此帧中的字节是用 cp1251(西里尔文)编码的。

到目前为止,这是我的代码:

 >>> from mutagen.mp3 import MP3
>>> mp3 = MP3(paths[0])
>>> mp3['TALB']
TALB(encoding=0, text=[u'\xc1\xf3\xf0\xe6\xf3\xe9\xf1\xea\xe8\xe5 \xef\xeb\xff\xf1\xea\xe8'])

现在,如您所见,mp3['TALB'].text[0] 在这里表示为 Unicode 字符串。然而,它是 mojibaked:

 >>> print mp3['TALB'].text[0]
Áóðæóéñêèå ïëÿñêè

我在将这些 cp1251 字节转码为正确的 Unicode 代码点方面运气不佳。到目前为止,我最好的成绩非常不合适:

>>> st = ''.join([chr(ord(x)) for x in mp3['TALB'].text[0]]); st
'\xc1\xf3\xf0\xe6\xf3\xe9\xf1\xea\xe8\xe5 \xef\xeb\xff\xf1\xea\xe8'
>>> print st.decode('cp1251')
Буржуйские пляски <-- **this is the correct, demojibaked text!**

据我所知,这种方法之所以有效,是因为我最终将 Unicode 字符串转换为 8 位字符串,然后我可以将其解码为 Unicode,同时指定我解码的编码。

问题是我不能直接对 Unicode 字符串进行decode('cp1251'):

>>> st = mp3['TALB'].text[0]; st
u'\xc1\xf3\xf0\xe6\xf3\xe9\xf1\xea\xe8\xe5 \xef\xeb\xff\xf1\xea\xe8'
>>> print st.decode('cp1251')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/dmitry/dev/mp3_tag_encode_convert/lib/python2.7/encodings/cp1251.py", line 15, in decode
return codecs.charmap_decode(input,errors,decoding_table)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

谁能解释一下?我无法理解如何在直接对 u'' 字符串进行操作时使其不解码为 7 位 ascii 范围。

最佳答案

首先,将其编码为您已知的编码方式。

>>> tag = u'\xc1\xf3\xf0\xe6\xf3\xe9\xf1\xea\xe8\xe5 \xef\xeb\xff\xf1\xea\xe8'
>>> raw = tag.encode('latin-1'); raw
'\xc1\xf3\xf0\xe6\xf3\xe9\xf1\xea\xe8\xe5 \xef\xeb\xff\xf1\xea\xe8'

然后你可以用正确的编码解码它。

>>> fixed = raw.decode('cp1251'); print fixed
Буржуйские пляски

关于python - 使用 Python 和 mutagen 去除 mojibaking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14168011/

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