我现在正在学习python和PyGTK,并创建了一个简单的音乐组织者。 http://pastebin.com/m2b596852 但当它用挪威字母æ,ø和å编辑歌曲时,它只是将它们变成一个奇怪的角色。
那么有没有什么好方法可以将名称打开或编码为utf-8字符?
从文件中读取信息:
def __parse(self, filename):
"parse ID3v1.0 tags from MP3 file"
self.clear()
self['artist'] = 'Unknown'
self['title'] = 'Unknown'
try:
fsock = open(filename, "rb", 0)
try:
fsock.seek(-128, 2)
tagdata = fsock.read(128)
finally:
fsock.close()
if tagdata[:3] == 'TAG':
for tag, (start, end, parseFunc) in self.tagDataMap.items():
self[tag] = parseFunc(tagdata[start:end])
except IOError:
pass
打印到sys.stdout信息:
for info in files:
try:
os.rename(info['name'],
os.path.join(self.dir, info['artist'])+' - '+info['title']+'.mp3')
print 'From: '+ info['name'].replace(os.path.join(self.dir, ''), '')
print 'To: '+ info['artist'] +' - '+info['title']+'.mp3'
print
self.progressbar.set_fraction(i/num)
self.progressbar.set_text('File %d of %d' % (i, num))
i += 1
except IOError:
print 'Rename fail'
答案 0 :(得分:8)
你想首先解码它在TO utf-8中的字符集输入(在Python中,编码意味着“从unicode / utf-8转到其他一些字符集”)。
一些谷歌搜索表明,挪威的字符集是普通的'iso-8859-1'...我希望如果我对这个细节错了,有人可以纠正我。无论如何,无论以下示例中的charset名称如何:
tagdata[start:end].decode('iso-8859-1')
在真实世界的应用中,我意识到您不能保证输入是挪威语或任何其他字符集。在这种情况下,您可能希望继续浏览一系列可能的字符集,以查看哪些可以成功转换。 SO和谷歌都有一些关于算法的建议,以便在Python中有效地做到这一点。听起来比实际上更可怕。
答案 1 :(得分:1)
您需要将从文件中读取的字节串转换为Unicode字符串。看看你的代码,我会在解析函数中这样做,即用这样的东西替换stripnulls
def stripnulls_and_decode(data):
return codecs.utf_8_decode(data.replace("\00", "")).strip()
请注意,这仅在文件中的字符串实际上以UTF-8编码时才有效 - 如果它们采用不同的编码,则必须使用codecs
中相应的解码函数模块。
答案 2 :(得分:1)
我不知道用于mp3标签的编码是什么,但如果你确定它是UTF-8那么:
tagdata[start:end].decode("utf-8")
第# -*- coding: utf-8 -*-
行定义了您的源代码编码,并没有定义用于读取或写入文件的编码。