Nie sądzę, że znajdziesz samodzielną aplikację, która naprawi twój wybór nieprawidłowo oznakowanych kodowań. Posiadanie mieszaniny cp1252, UTF-16 i GB-18030 jest dość niezwykłe i nie sądzę, aby istniejące oprogramowanie mogło rozwiązać to automatycznie.
Pobrałbym więc Mutagen i napisałem niestandardowy skrypt w języku Python, aby zautomatyzować własne decyzje dotyczące naprawy nieznanych kodowań. Na przykład:
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()
Powyższy skrypt zawiera kilka założeń:
Tylko tagi oznaczone jako będące w kodowaniu 0 są nieprawidłowe. (Pozornie kodowanie 0 to ISO-8859-1, ale w praktyce często jest to domyślna strona kodowa systemu Windows).
Jeśli znacznik jest oznaczony jako kodowany w UTF-8 lub UTF-16, zakłada się, że jest poprawny i po prostu przekonwertowany na UTF-8, jeśli jeszcze nie jest. Osobiście nie widziałem wcześniej ID3 oznaczonych jako UTF (kodowanie 1-3). Na szczęście kodowanie 0 jest łatwe do odzyskania w oryginalnych bajtach, ponieważ ISO-8859-1 to bezpośrednie mapowanie wartości bajtów porządkowych 1 do 1.
Po spełnieniu znacznika kodującego 0 skrypt próbuje najpierw przekształcić go w GB18030, a następnie, jeśli jest niepoprawny, wraca do strony kodowej 1252. Kodowania jednobajtowe, takie jak cp1252, będą zwykle pasować do większości sekwencji bajtów, więc najlepiej je umieścić na końcu listy kodowań do wypróbowania.
Jeśli masz inne kodowania, takie jak cp1251 Cyrylica lub wiele nazw plików cp1252 z wieloma znakami akcentowanymi z rzędu, które mylą się z GB18030, będziesz potrzebować jakiegoś sprytniejszego algorytmu zgadywania. Może spójrz na nazwę pliku, aby odgadnąć, jakie znaki mogą być obecne?
mid3v2
to tylko połowa rozwiązania. Po wypróbowaniu zdecydowanie nie jest to dobre z błędnie zidentyfikowanymi kodowaniami, na które cierpię, tj. Ulepszony tag ID3 nadal wyświetla się nieprawidłowo w Amaroku. Mutagen nie spełnia moich wymagań dotyczących „mądrego zrozumienia oryginalnego kodowania”; beztrosko przyjmujeLatin1
/Windows-1252
, co jest zgodne ze standardem, ale bezużyteczne w nieuporządkowanym świecie rzeczywistym. Jestem skłonny nie zaakceptować tej odpowiedzi w tej chwili; Dam jeszcze kilka dni na inne odpowiedzi. Jeśli nic dobrego nie przyjdzie, zostaniesz zaakceptowany.