Ich glaube nicht, dass Sie eine eigenständige Anwendung finden werden, die Ihre spezielle Auswahl an falsch gekennzeichneten Codierungen korrigiert. Eine Mischung aus cp1252, UTF-16 und GB-18030 zu haben, ist ziemlich ungewöhnlich und ich glaube nicht, dass vorhandene Software dies automatisch lösen kann.
Also würde ich Mutagen herunterladen und ein benutzerdefiniertes Python-Skript schreiben, um Ihre eigenen Entscheidungen darüber zu automatisieren, wie unbekannte Codierungen repariert werden sollen. Zum Beispiel:
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()
Das obige Skript macht einige Annahmen:
Nur die Tags, die als in Codierung 0 markiert sind, sind falsch. (Angeblich ist die Codierung von 0 ISO-8859-1, in der Praxis handelt es sich jedoch häufig um eine Windows-Standardcodepage.)
Wenn ein Tag als UTF-8- oder UTF-16-Codierung markiert ist, wird es als korrekt angenommen und einfach in UTF-8 konvertiert, sofern dies noch nicht geschehen ist. Persönlich habe ich noch keine fehlerhaften ID3s gesehen, die als UTF (Codierungen 1-3) markiert waren. Glücklicherweise kann die Codierung von 0 leicht in ihre ursprünglichen Bytes wiederhergestellt werden, da ISO-8859-1 eine direkte 1: 1-Zuordnung der ordinalen Bytewerte ist.
Wenn ein Tag mit der Codierung 0 erfüllt ist, versucht das Skript, es zuerst als GB18030 neu zu formulieren. Wenn es nicht gültig ist, wird auf Codepage 1252 zurückgegriffen. Einzelbyte-Codierungen wie cp1252 stimmen in der Regel mit den meisten Byte-Sequenzen überein am Ende der Liste der zu versuchenden Codierungen.
Wenn Sie andere Codierungen wie cp1251 Cyrillic oder viele cp1252-Dateinamen mit mehreren Zeichen mit Akzent hintereinander haben, die mit GB18030 verwechselt werden, benötigen Sie einen cleveren Schätzalgorithmus. Schauen Sie sich vielleicht den Dateinamen an, um zu erraten, welche Art von Zeichen wahrscheinlich vorhanden sind.
mid3v2
ist nur die halbe Lösung. Nachdem ich es ausprobiert habe, ist es definitiv nicht gut mit den falsch identifizierten Codierungen, unter denen ich leide, dh ein aktualisiertes ID3-Tag wird in Amarok immer noch falsch angezeigt. Mutagen scheitert an meiner Forderung nach »klug, die ursprüngliche Kodierung herauszufinden«; es geht freudig vonLatin1
/ ausWindows-1252
, was standardkonform ist, aber für die unordentliche reale Welt nutzlos. Ich bin geneigt, diese Antwort jetzt nicht zu akzeptieren; Ich werde noch ein paar Tage Gelegenheit für andere Antworten geben. Wenn nichts Gutes kommt, werden Sie akzeptiert.