でモジベイクされたID3タグを読んでいmutagen
ます。私の目標は、エンコーディングと Python の処理について学びながら、mojibake を修正することです。
作業中のファイルにはID3v2
タグがあり、そのアルバム ( ) フレームを見ています。これは、 ID3 フレームTALB
のエンコード バイトによると、 Latin-1 ( ) でエンコードされています。ただし、このフレームのバイトが(キリル文字) でエンコードされていることはわかっています。TALB
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 文字列として表されています。ただし、モジベイクされています。
>>> 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 にデコードし、デコード元のエンコーディングを指定するため、うまくいきます。
decode('cp1251')
問題は、Unicode 文字列を直接処理できないことです。
>>> 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)
誰かがこれを説明できますか?ascii
文字列を直接操作するときに、7 ビットの範囲にデコードしないようにする方法がわかりませんu''
。