Я не думаю, что вы найдете отдельное приложение, которое исправит ваш определенный выбор неправильно маркированных кодировок. Наличие смеси 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, если его еще нет. Лично я раньше не видел ID3, помеченных как UTF (кодировки 1-3) по ошибке. К счастью, кодирование 0 легко восстановить в исходные байты, поскольку ISO-8859-1 является прямым отображением порядковых значений байтов 1: 1.
Когда встречается тег кодирования 0, сценарий пытается сначала преобразовать его в GB18030, а затем, если он недопустим, возвращается к кодовой странице 1252. Однобайтовые кодировки, такие как cp1252, будут иметь тенденцию совпадать с большинством байтовых последовательностей, поэтому лучше всего поместить их в конец списка кодировок, чтобы попробовать.
Если у вас есть другие кодировки, такие как cp1251 Cyrillic, или множество имен файлов cp1252 с несколькими символами ударения в строке, которые ошибочно принимают за GB18030, вам понадобится более умный алгоритм угадывания. Может быть, посмотрите на имя файла, чтобы угадать, какие символы могут присутствовать?