ID3_V1 はlatin1
エンコードのみをサポートします。V1 タグをロシア文字で記述するために、cp1251
エンコーディングが使用されます。V2タグ(unicode)からV1タグにデータをコピーしたいと考えています。eyeD3 を使用して、次のコードで V2 タグを取得します。
tag.link(mp3path, v=eyeD3.ID3_V2)
mp3album_v2 = tag.getAlbum()
...
tag.link(mp3path, v=eyeD3.ID3_V1)
tag.setTextEncoding(eyeD3.LATIN1_ENCODING)
tag.setAlbum(mp3album_v2.encode('cp1251')) # ???
tag.update()
以下が返されます。
>>> print mp3album_v2
Жить в твоей голове
>>> print type(mp3album_v2)
<type 'unicode'>
>>> print repr(mp3album_v2)
u'\u0416\u0438\u0442\u044c \u0432 \u0442\u0432\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435'
文字列 (?)をsetAlbum
期待しているように見えます:utf-8
def setAlbum(self, a):
self.setTextFrame(ALBUM_FID, self.strToUnicode(a));
def strToUnicode(self, s):
t = type(s);
if t != unicode and t == str:
s = unicode(s, eyeD3.LOCAL_ENCODING);
elif t != unicode and t != str:
raise TagException("Wrong type passed to strToUnicode: %s" % str(t));
return s;
しかし、やろうとするとtag.setAlbum(mp3album_v2.encode('cp1251').encode('utf-8'))
、エラーが発生しますUnicodeDecodeError: 'utf8' codec can't decode byte 0xc6 in position 0: invalid continuation byte