誤ってタグ付けされたエンコーディングの特定の選択を修正するスタンドアロンアプリケーションを見つけることはないと思います。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に変換されていません。個人的に私は、UTF(エンコーディング1〜3)としてマークされたID3を誤って見たことはありません。ISO-8859-1は序数のバイト値を1対1で直接マッピングするため、幸いにも0をエンコードして元のバイトに戻すのは簡単です。
エンコーディング0タグが満たされると、スクリプトは最初にGB18030として再キャストしようとし、それが無効な場合はコードページ1252にフォールバックします。cp1252のようなシングルバイトエンコーディングはほとんどのバイトシーケンスに一致する傾向があるため、それらを置くのが最善です。試行するエンコーディングのリストの最後に。
cp1251キリル文字のような他のエンコーディング、または複数のアクセント付き文字が連続する多数のcp1252ファイル名があり、それらがGB18030と間違われる場合、ある種の巧妙な推測アルゴリズムが必要になります。ファイル名を見て、どのような文字が存在する可能性が高いかを推測してください。
mid3v2
ソリューションの半分にすぎません。それを試した後、私が苦しんでいる誤って識別されたエンコーディングでは間違いなく良くなります。つまり、アップグレードされたID3タグはAmarokでまだ正しく表示されません。Mutagenは、「元のエンコーディングを理解することについてのスマート」という私の要件を満たしていません。Latin1
/はWindows-1252
、標準に準拠していますが、乱雑な現実の世界では役に立たないものと想定しています。私は今この答えを受け入れない傾向があります。私は他の答えのために数日機会を与えます。何も良いことが来なければ、受け入れられます。