Yanlış etiketlenmiş kodlama seçiminizi düzelten bağımsız bir uygulama bulacağınızı sanmıyorum. Cp1252, UTF-16 ve GB-18030'un karışımı oldukça sıra dışı ve mevcut yazılımın bunu otomatik olarak çözebileceğini düşünmüyorum.
Bu yüzden Mutagen'i indirir ve bilinmeyen kodlamaları nasıl düzelteceğiniz konusunda kendi kararlarınızı otomatikleştirmek için özel bir Python betiği yazarım. Örneğin:
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()
Yukarıdaki komut dosyası birkaç varsayımda bulunur:
Yalnızca 0 kodlamasında işaretli olan etiketler yanlıştır. (Görünüşte 0 kodlaması ISO-8859-1'dir, ancak pratikte genellikle Windows varsayılan kod sayfasıdır.)
Bir etiket UTF-8 veya UTF-16 kodlamasında olarak işaretlenirse, doğru olduğu varsayılır ve henüz değilse UTF-8'e dönüştürülür. Şahsen daha önce yanlışlıkla UTF (1-3 kodlamaları) olarak işaretlenmiş ID3s görmedim. Neyse ki, 0 kodlaması orijinal baytlarına geri döndürülebilir, çünkü ISO-8859-1 sıralı bayt değerlerinin 1'e 1 doğrudan eşlemesidir.
Bir kodlama 0 etiketi karşılandığında, komut dosyası önce GB18030 olarak yeniden düzenlemeye çalışır, ardından geçerli değilse kod sayfasına geri döner 1252. cp1252 gibi tek baytlı kodlamalar çoğu bayt dizisiyle eşleşmeye eğilimlidir, bu yüzden bunları koymak en iyisidir kodlama listesinin sonunda denenecek.
Cp1251 Cyrillic veya arka arkaya birden fazla aksanlı karakter içeren bir çok cp1252 dosya adı gibi GB18030 ile karıştırılan başka kodlamalarınız varsa, bir çeşit akıllı tahmin algoritmasına ihtiyacınız olacaktır. Belki de ne tür karakterlerin mevcut olacağını tahmin etmek için dosya adına bakın?
mid3v2
çözümün sadece yarısıdır. Denedikten sonra, muzdarip olduğum yanlış tanımlanmış kodlamalar ile kesinlikle iyi değil, yani yükseltilmiş bir ID3 etiketi Amarok'ta hala yanlış görüntüleniyor. Mutagen, »orijinal kodlamayı anlama konusunda akıllım«; bu standart olarak uyumlu, ama dağınık gerçek dünya için işe yaramaz bir şekildeLatin1
/ varsayarWindows-1252
. Şu anda bu cevabı kabul etmeme eğilimindeyim; Diğer cevaplar için birkaç gün daha fırsat vereceğim. İyi bir şey gelmezse kabul edilirsiniz.