Я не думаю, що ви збираєтеся знайти автономне додаток, яке виправить ваш конкретний вибір неправильно позначених кодувань. Маючи суміш 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, або безліч назви файлів cp1252 з декількома символами наголосом поспіль, які помиляються на GB18030, вам знадобиться розумніший алгоритм відгадування. Можливо, подивіться на ім’я файлу, щоб здогадатися, які символи можуть бути присутніми?
mid3v2
- це лише половина розчину. Після спроби це, безумовно, непогано з неправильно визначеними кодуваннями, від яких я страждаю, тобто оновлений тег ID3 все ще відображається неправильно в Amarok. Мутаген не відповідає моїй вимозі про «розумний розбір оригінального кодування»; це дуже припускаєLatin1
/Windows-1252
, що є стандартним, але марним для брудного реального світу. Я схильний не приймати цю відповідь зараз; Я дам можливість ще кілька днів для інших відповідей. Якщо нічого доброго не приходить, вас приймають.