2

でモジベイクされたID3タグを読んでいmutagenます。私の目標は、エンコーディングと Python の処理について学びながら、mojibake を修正することです。

作業中のファイルにはID3v2タグがあり、そのアルバム ( ) フレームを見ています。これは、 ID3 フレームTALBのエンコード バイトによると、 Latin-1 ( ) でエンコードされています。ただし、このフレームのバイトが(キリル文字) でエンコードされていることはわかっています。TALBISO-8859-1cp1251

これまでの私のコードは次のとおりです。

 >>> 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''

4

1 に答える 1

5

最初に、既に使用されていることがわかっているエンコーディングでエンコードします。

>>> 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
Буржуйские пляски
于 2013-01-05T02:48:20.290 に答える