ฉันไม่คิดว่าคุณจะพบแอปพลิเคชันแบบสแตนด์อโลนที่จะแก้ไขการเข้ารหัสที่ติดแท็กไม่ถูกต้อง การมีส่วนผสมของ 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 Cyrillic หรือชื่อไฟล์ cp1252 จำนวนมากที่มีอักขระเน้นเสียงหลายตัวติดต่อกันซึ่งทำให้เข้าใจผิดว่าเป็น GB18030 คุณจะต้องใช้อัลกอริธึมที่ชาญฉลาดในการเรียงลำดับบางอย่าง อาจดูชื่อไฟล์เพื่อเดาว่ามีตัวละครประเภทไหนที่น่าจะนำเสนอ?
mid3v2
เป็นวิธีแก้ปัญหาเพียงครึ่งเดียว หลังจากลองใช้แล้วมันไม่ดีอย่างแน่นอนกับการเข้ารหัสที่ฉันระบุที่ฉันกำลังทนทุกข์ทรมานนั่นคือแท็ก ID3 ที่อัปเกรดแล้วยังแสดงผิดใน Amarok Mutagen ไม่ต้องการของฉันเกี่ยวกับ»ฉลาดในการหาการเข้ารหัสดั้งเดิม«; มันเป็นการสันนิษฐานLatin1
/Windows-1252
ซึ่งเป็นไปตามมาตรฐาน แต่ไม่มีประโยชน์สำหรับโลกแห่งความยุ่งเหยิง ฉันมีแนวโน้มที่จะไม่ยอมรับคำตอบนี้ในตอนนี้ ฉันจะให้โอกาสอีกสองสามวันสำหรับคำตอบอื่น ๆ ถ้าไม่มีอะไรดีคุณก็จะได้รับการยอมรับ