Tôi không nghĩ rằng bạn sẽ tìm thấy một ứng dụng độc lập sẽ sửa chữa lựa chọn mã hóa được gắn thẻ không chính xác của bạn. Có hỗn hợp cp1252, UTF-16 và GB-18030 khá bất thường và tôi không nghĩ phần mềm hiện có sẽ có thể giải quyết điều đó một cách tự động.
Vì vậy, tôi sẽ tải xuống Mutagen và viết một tập lệnh Python tùy chỉnh để tự động hóa các quyết định của riêng bạn về cách khắc phục các mã hóa không xác định. Ví dụ:
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()
Kịch bản trên đưa ra một vài giả định:
Chỉ các thẻ được đánh dấu là mã hóa 0 là sai. (Mã hóa rõ ràng 0 là ISO-8859-1, nhưng trong thực tế, nó thường là trang mã mặc định của Windows.)
Nếu một thẻ được đánh dấu là ở dạng mã hóa UTF-8 hoặc UTF-16 thì nó được coi là chính xác và chỉ cần chuyển đổi thành UTF-8 nếu nó chưa được mã hóa. Cá nhân tôi chưa thấy ID3 được đánh dấu là UTF (mã hóa 1-3) bị lỗi trước đó. May mắn thay, mã hóa 0 rất dễ phục hồi thành các byte gốc của nó vì ISO-8859-1 là ánh xạ trực tiếp 1 đến 1 của các giá trị byte thứ tự.
Khi đáp ứng thẻ mã hóa 0, tập lệnh cố gắng lấy lại thành GB18030 trước, sau đó nếu nó không hợp lệ sẽ quay lại trang mã 1252. Các mã hóa một byte như cp1252 sẽ có xu hướng khớp với hầu hết các chuỗi byte, vì vậy tốt nhất là đặt chúng ở cuối danh sách mã hóa để thử.
Nếu bạn có các bảng mã khác như cp1251 Cyrillic hoặc rất nhiều tên tệp cp1252 có nhiều ký tự có dấu liên tiếp, sẽ bị nhầm với GB18030, bạn sẽ cần một thuật toán đoán thông minh hơn. Có thể nhìn vào tên tệp để đoán loại nhân vật nào có khả năng có mặt?
mid3v2
chỉ là một nửa giải pháp. Sau khi thử nó, nó chắc chắn không tốt với các mã hóa được xác định sai mà tôi đang mắc phải, tức là thẻ ID3 được nâng cấp vẫn hiển thị sai trong Amarok. Mutagen không đạt yêu cầu của tôi về »thông minh về việc tìm ra mã hóa ban đầu«; nó hoàn toàn giả địnhLatin1
/Windows-1252
, đó là tuân thủ tiêu chuẩn, nhưng vô dụng đối với thế giới thực lộn xộn. Tôi có khuynh hướng không chấp nhận câu trả lời này ngay bây giờ; Tôi sẽ cho một vài ngày nữa cơ hội cho các câu trả lời khác. Nếu không có gì tốt đến, bạn được chấp nhận.