1

该文件可以具有cp1251utf-8编码。我应该:

  1. 删除 id3 v2 标签
  2. 将 id3 v1 标签的编码更改为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)。

因此,我认为您的方法根本行不通。基本上,您不能将任意编码的数据传递给 eyeD3,就像您尝试在脚本的倒数第二行中所做的那样。

eyeD3 似乎确实提供了与编码相关的设施,但:

tag.setTextEncoding(encoding)

但是,通过阅读该函数的代码,ID3 规范只允许少数特定编码,而 iso-8859-5 不在其中。

因此,ID3 规范似乎根本不允许您尝试做的事情。如果您在这里尝试做的是围绕该规范工作,那么遵循它的 eyeD3 恐怕不会有帮助。

也许您想根据您通过摆弄标签编码来实现的确切目标来重新表述您的问题?然后可以提出其他解决方案。

于 2012-08-21T13:59:20.940 回答