Não acho que você encontre um aplicativo independente que conserte sua seleção específica de codificações marcadas incorretamente. Ter uma mistura de cp1252, UTF-16 e GB-18030 é bastante incomum e não acho que o software existente possa resolvê-lo automaticamente.
Então, eu baixava o Mutagen e escrevia um script Python personalizado para automatizar suas próprias decisões sobre como corrigir codificações desconhecidas. Por exemplo:
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()
O script acima faz algumas suposições:
Somente as tags marcadas como codificando 0 estão incorretas. (Codificar ostensivamente 0 é ISO-8859-1, mas na prática geralmente é uma página de código padrão do Windows.)
Se uma tag estiver marcada como sendo na codificação UTF-8 ou UTF-16, será considerada correta e simplesmente convertida em UTF-8, se ainda não estiver. Pessoalmente, nunca vi ID3s marcados como UTF (codificações 1-3) antes. Felizmente, a codificação 0 é fácil de recuperar em seus bytes originais, pois ISO-8859-1 é um mapeamento direto de 1 para 1 dos valores de bytes ordinais.
Quando uma tag de codificação 0 é alcançada, o script tenta reformulá-la primeiro como GB18030; depois, se não for válida, retornará à página de códigos 1252. Codificações de byte único como cp1252 tenderão a corresponder à maioria das seqüências de bytes, por isso é melhor colocá-las. no final da lista de codificações para tentar.
Se você tiver outras codificações como cp1251 cirílico ou muitos nomes de arquivos cp1252 com vários caracteres acentuados em uma linha, que se confundem com GB18030, precisará de algum tipo de algoritmo de adivinhação mais inteligente. Talvez veja o nome do arquivo para adivinhar que tipo de caracteres provavelmente estará presente.
mid3v2
é apenas metade da solução. Depois de tentar, definitivamente não é bom com as codificações mal identificadas das quais estou sofrendo, ou seja, uma tag ID3 atualizada ainda é exibida incorretamente no Amarok. O mutagênico falha na minha exigência de "inteligente em descobrir a codificação original"; ele assume alegrementeLatin1
/Windows-1252
, que é compatível com o padrão, mas inútil para o mundo real confuso. Estou inclinado a não aceitar esta resposta agora; Darei mais alguns dias para outras respostas. Se nada de bom vier, você será aceito.