Je ne pense pas que vous allez trouver une application autonome qui corrigera votre sélection particulière d'encodages mal étiquetés. Avoir un mélange de cp1252, UTF-16 et GB-18030 est assez inhabituel et je ne pense pas que les logiciels existants seront capables de résoudre cela automatiquement.
Je téléchargerais donc Mutagen et j'écrirais un script Python personnalisé pour automatiser vos propres décisions sur la façon de corriger les encodages inconnus. Par exemple:
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()
Le script ci-dessus fait quelques hypothèses:
Seules les balises marquées comme étant dans l'encodage 0 sont incorrectes. (Le codage ostensiblement 0 est ISO-8859-1, mais en pratique, il s'agit souvent d'une page de codes par défaut de Windows.)
Si une étiquette est marquée comme étant en UTF-8 ou en encodage UTF-16, elle est supposée être correcte, et simplement convertie en UTF-8 si ce n'est pas déjà fait. Personnellement, je n'ai jamais vu d'erreur ID3 marqués comme UTF (encodages 1-3). Heureusement, le codage 0 est facile à récupérer dans ses octets d'origine car ISO-8859-1 est un mappage direct 1 à 1 des valeurs d'octets ordinaux.
Lorsqu'une balise d'encodage 0 est rencontrée, le script tente d'abord de la refondre en GB18030, puis si elle n'est pas valide, revient à la page de code 1252. Les codages à un octet comme cp1252 auront tendance à correspondre à la plupart des séquences d'octets, il est donc préférable de les mettre à la fin de la liste des encodages à essayer.
Si vous avez d'autres encodages comme cp1251 cyrillique, ou beaucoup de noms de fichiers cp1252 avec plusieurs caractères accentués d'affilée, qui se trompent pour GB18030, vous aurez besoin d'un algorithme de devinette plus intelligent. Peut-être regardez le nom du fichier pour deviner quel type de caractères sont susceptibles d'être présents?
mid3v2
n'est que la moitié de la solution. Après l'avoir essayé, il n'est certainement pas bon avec les encodages mal identifiés dont je souffre, c'est-à-dire qu'une balise ID3 mise à niveau s'affiche toujours mal dans Amarok. Mutagen échoue à mon exigence de «savoir comment comprendre l'encodage d'origine»; il suppose allègrementLatin1
/Windows-1252
, qui est conforme au standard, mais inutile pour le monde réel désordonné. Je suis enclin à ne pas accepter cette réponse pour le moment; Je vais donner quelques jours de plus pour d'autres réponses. Si rien de bon ne vient, vous êtes accepté.