我认为您不会找到一个独立的应用程序来解决您选择的不正确标记的编码的问题。混合使用cp1252,UTF-16和GB-18030是非常不寻常的,我认为现有软件无法自动解决该问题。
因此,我将下载Mutagen并编写一个自定义Python脚本,以使您自己有关如何修复未知编码的决定自动化。例如:
musicroot= ur'C:\music\wonky'
tryencodings= 'gb18030', 'cp1252'
import os
import mutagen.id3
def findMP3s(path):
for child in os.listdir(path):
child= os.path.join(path, child)
if os.path.isdir(child):
for mp3 in findMP3s(child):
yield mp3
elif child.lower().endswith(u'.mp3'):
yield child
for path in findMP3s(musicroot):
id3= mutagen.id3.ID3(path)
for key, value in id3.items():
if value.encoding!=3 and isinstance(getattr(value, 'text', [None])[0], unicode):
if value.encoding==0:
bytes= '\n'.join(value.text).encode('iso-8859-1')
for encoding in tryencodings:
try:
bytes.decode(encoding)
except UnicodeError:
pass
else:
break
else:
raise ValueError('None of the tryencodings work for %r key %r' % (path, key))
for i in range(len(value.text)):
value.text[i]= value.text[i].encode('iso-8859-1').decode(encoding)
value.encoding= 3
id3.save()
上面的脚本做了一些假设:
只有标记为编码为0的标签是错误的。(表面上编码为0的是ISO-8859-1,但实际上,它通常是Windows的默认代码页。)
如果标记被标记为采用UTF-8或UTF-16编码,则假定它是正确的,如果尚未将其转换为UTF-8,则将其简单地转换为UTF-8。我个人之前还没有看到ID3标记为UTF(编码1-3)错误。幸运的是,由于ISO-8859-1是顺序字节值的一对一直接映射,因此很容易将0编码恢复为其原始字节。
当遇到编码0标记时,脚本首先尝试将其重铸为GB18030,然后如果无效,则退回到代码页1252。单字节编码(例如cp1252)将倾向于匹配大多数字节序列,因此最好将它们放入在要尝试的编码列表的末尾。
如果您使用的其他编码(例如cp1251西里尔字母)或大量带有连续多个重音字符的cp1252文件名被误认为是GB18030,则需要一种更聪明的猜测算法。也许看看文件名来猜测可能会出现哪种字符?
mid3v2
仅是解决方案的一半。尝试后,使用我遭受的错误识别的编码绝对不好,即升级的ID3标签在Amarok中仍然显示错误。Mutagen无法满足我对“聪明地找出原始编码”的要求。它巧妙地假设Latin1
/Windows-1252
,这是标准的一致性,但对凌乱的现实世界没有用。我倾向于现在不接受这个答案。我将再给几天机会寻找其他答案。如果没有任何好处,您就会被接受。