Saya tidak berpikir Anda akan menemukan aplikasi mandiri yang akan memperbaiki pilihan pengkodean pilihan Anda yang salah. Memiliki campuran cp1252, UTF-16 dan GB-18030 sangat tidak biasa dan saya tidak berpikir perangkat lunak yang ada akan dapat menyelesaikannya secara otomatis.
Jadi saya akan mengunduh Mutagen dan menulis skrip Python khusus untuk mengotomatisasi keputusan Anda sendiri tentang cara memperbaiki penyandian yang tidak dikenal. Sebagai contoh:
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()
Script di atas membuat beberapa asumsi:
Hanya tag yang ditandai sebagai dalam pengkodean 0 yang salah. (Pengkodean 0 adalah ISO-8859-1, tetapi dalam praktiknya sering merupakan halaman kode default Windows.)
Jika sebuah tag ditandai sebagai dalam pengkodean UTF-8 atau UTF-16 itu dianggap benar, dan hanya dikonversi ke UTF-8 jika belum. Secara pribadi saya belum pernah melihat ID3 ditandai sebagai UTF (penyandian 1-3) dalam kesalahan sebelumnya. Untungnya, pengkodean 0 mudah untuk dipulihkan ke dalam byte aslinya karena ISO-8859-1 adalah pemetaan langsung 1-ke-1 dari nilai byte ordinal.
Ketika tag pengkodean 0 terpenuhi, skrip mencoba untuk menyusunnya kembali sebagai GB18030 terlebih dahulu, kemudian jika tidak valid kembali ke kode halaman 1252. Pengodean byte tunggal seperti cp1252 akan cenderung cocok dengan urutan byte paling banyak, jadi yang terbaik adalah menempatkannya di akhir daftar penyandian untuk dicoba.
Jika Anda memiliki penyandian lain seperti cp1251 Cyrillic, atau banyak nama file cp1252 dengan beberapa karakter beraksen berturut-turut, yang keliru dengan GB18030, Anda akan memerlukan semacam algoritma tebakan yang lebih pintar. Mungkin melihat nama file untuk menebak karakter seperti apa yang mungkin ada?
mid3v2
hanya setengah dari solusi. Setelah mencobanya, jelas tidak baik dengan penyandian yang salah identifikasi yang saya alami, yaitu tag ID3 yang ditingkatkan masih menampilkan kesalahan di Amarok. Mutagen gagal persyaratan saya tentang »pintar mencari tahu pengkodean asli«; itu dengan asyik mengasumsikanLatin1
/Windows-1252
, yang merupakan konforman standar, tetapi tidak berguna untuk dunia nyata yang berantakan. Saya cenderung tidak menerima jawaban ini sekarang; Saya akan memberikan beberapa hari lagi kesempatan untuk jawaban lain. Jika tidak ada yang baik datang, Anda diterima.