태그가 잘못 지정된 인코딩의 특정 선택을 수정하는 독립 실행 형 응용 프로그램을 찾을 것이라고 생각하지 않습니다. 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로 변환되지 않은 경우 간단합니다. 개인적으로 나는 이전에 오류로 UTF3 (인코딩 1-3)으로 표시된 ID3을 보지 못했습니다. 운 좋게도 0을 인코딩하면 ISO-8859-1이 서수 바이트 값의 일대일 직접 매핑이므로 원래 바이트로 쉽게 복구 할 수 있습니다.
인코딩 0 태그가 충족되면 스크립트는 먼저 GB18030으로 다시 캐스트하려고 시도하고, 유효하지 않은 경우 코드 페이지 1252로 돌아갑니다. cp1252와 같은 단일 바이트 인코딩은 대부분의 바이트 시퀀스와 일치하는 경향이 있으므로이를 넣는 것이 가장 좋습니다. 시도 할 인코딩 목록의 끝에.
GB18030으로 잘못 인식되는 cp1251 Cyrillic과 같은 다른 인코딩이나 여러 악센트 문자가있는 많은 cp1252 파일 이름이 GB18030으로 잘못 인식되면 어떤 종류의 영리한 추측 알고리즘이 필요합니다. 파일 이름을보고 어떤 종류의 문자가 존재할지 추측 할 수 있습니까?
mid3v2
솔루션의 절반에 불과합니다. 그것을 시도한 후에, 내가 겪고있는 잘못 식별 된 인코딩, 즉 업그레이드 된 ID3 태그가 여전히 Amarok에서 잘못 표시 되는 것은 좋지 않습니다 . Mutagen은 원래의 인코딩을 알아내는 것에 대한»스마트에 대한 나의 요구에 실패합니다.;Latin1
/Windows-1252
는 표준을 준수하지만 지저분한 실제 세계에는 쓸모가 없다고 가정합니다 . 나는 지금이 대답을 받아들이지 않는 경향이있다. 다른 답변에 며칠 더 기회를 주겠습니다. 좋은 것이 없으면 받아 들여집니다.