1

ファイルにはcp1251utf-8エンコーディングを含めることができます。そうするべきです:

  1. id3v2タグを削除します
  2. id3v1タグのエンコーディングをに変更しますiso-8859-5

私は次のことをします:

def getTagStr (tagUnicStr):
    # gets the 1byte 8bits string, as written in the tag, from the unicode, returned by tag.get*
    # taken from tag2utf-0.16 by Kopats Andrei
    ls = []
    for i in range(0,len(tagUnicStr)):
        if (ord(tagUnicStr[i]) in range(256)):
            ls.append(chr(ord(tagUnicStr[i])))
        else:
            ls.append(tagUnicStr[i])
    Str8 = ''.join(ls)
    return Str8

trackInfo = eyeD3.Mp3AudioFile(path)
tag = trackInfo.getTag()
tag.link(path)
mp3artist = tag.getArtist() # contains Russian characters
mp3artist = getTagStr(mp3artist)
mp3encoding = 'utf-8'
try:
    # pseudo utf-8 encoding
    mp3artist = mp3artist.decode('utf-8')
except UnicodeDecodeError, err:
    # cp1251
    mp3artist = mp3artist.decode('cp1251')
    mp3encoding = 'cp1251'
except UnicodeEncodeError, err:
    # utf-8
    pass

tag.setArtist(mp3artist.encode('iso-8859-5'))
tag.update()

最後の行に次のエラーが表示されて失敗します。

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 1-5: ordinal not in range(256)

私のコードの何が問題になっていますか?

4

1 に答える 1

0

ドキュメントはそれについて非常に不明確ですが、eyeD3 は 1/ Unicode、または現在のロケールのエンコーディングでエンコードされた 2/ バイトのタグのみを受け入れるようです (いずれにせよ、タグを Unicode に戻すために使用されます)。

したがって、あなたのアプローチはまったく機能しないと思います。基本的に、スクリプトの最後から 2 番目の行で行おうとしているように、任意にエンコードされたデータを eyeD3 に渡すことはできません。

ただし、eyeD3 はエンコーディング関連の機能を提供しているようです。

tag.setTextEncoding(encoding)

ただし、その関数のコードを読むと、ID3 仕様で許可されている特定のエンコーディングはごくわずかであり、iso-8859-5 はその中にありません。

したがって、ID3仕様は、あなたがしようとしていることを許可していないようです。ここでやろうとしているのがその仕様を回避することである場合、それに続く eyeD3 は役に立たない可能性が高いと思います。

おそらく、タグのエンコーディングをいじって何を達成しようとしているのかという観点から、質問を言い換えたいと思うでしょうか? その後、他の解決策が提案される可能性があります。

于 2012-08-21T13:59:20.940 に答える