1

アイスランド文字の id3 タグを読み取るときに問題が発生しました。
シェルからの簡単な例。

>>> audio = mutagen.easyid3.EasyID3('./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3')
>>> audio['title']
5: [u'Gling-Gl\xf3']

まず第一に、タグがどの文字エンコーディングに含まれているかを確認する方法がよくわかりません。私が集めたものから、これはミュータジェンでそれを行う方法です:

>>> audio = mutagen.id3.ID3('./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3')
>>> for key, value in audio.items():
...     print value.encoding

これは、各項目に対して「0」を出力します。

そして、id3タグの場合、数字0は文字列がiso-8859-1でエンコードされていることを意味することをどこかで見ましたが、そこからどこに行くべきかわかりません。これは正しくないと思いますか?

>>> audio.get('artist')[0].decode('iso-8859-1')
14: u'Bj\xc3\xb6rk'

お察しのとおり、文字エンコーディングの問題に関しては、私は非常に混乱しています。
私が望むのは、タグを適切な utf-8 文字列としてキャプチャして、データベースに配置できるようにすることだけです。これは一例に過ぎませんが、エンコーディングがまったく異なる他のファイルに出くわす可能性があると思いますので、万能な解決策を探しています。これを修正するだけで、軌道に乗るのに本当に役立ちます。

前もって感謝します。

4

2 に答える 2

1

エンコーディングの楽しい世界へようこそ。

このステップでは:

>>> audio = mutagen.easyid3.EasyID3('./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3')
>>> audio['title']
[u'Gling-Gl\xf3']

...あなたはユニコードバイト文字列になってしまいます。2 行目では、Python がこのバイト文字列の ASCII 表現を出力しているため、16 進値が表示されます。必要なのは、Python がそのバイト文字列を取得し、利用可能な文字エンコーディングの 1 つを使用してエンコードすることです。これは私にとっても混乱の元でした。文字から16進値にデコードし、16進値を文字にエンコードすることを覚えておいてください。

したがって、これを行う場合:

In [1]: s = u'./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3'

In [2]: s
Out[2]: u'./Bj\xf6rk/Albums/1990 - Gling-Gl\xf3 [mp3-231]/01 - Gling-Gl\xf3.mp3'

In [3]: s.encode('UTF-8')
Out[3]: './Bj\xc3\xb6rk/Albums/1990 - Gling-Gl\xc3\xb3 [mp3-231]/01 - Gling-Gl\xc3\xb3.mp3'

まあ、それは迷惑です。UTF-8 でエンコードするように指示しましたが、まだ ASCII を取得しています。秘訣は、Python でこのような呼び出しを行うと、入力が何であれ、ASCII 表現を出力するだけだということです。次のように変更した場合:

In [4]: print s.encode('UTF-8')
./Björk/Albums/1990 - Gling-Gló [mp3-231]/01 - Gling-Gló.mp3

...正しい結果が表示されます。したがって、新しくエンコードされたテキストで実際に何かを実行すると、希望どおりに表現されていることがわかります。コンソールに出力したり、ファイルに書き込んだり、GUI ウィジェットに表示したりしても問題なく表示されます。

于 2011-08-28T10:51:42.723 に答える
0
if len(Genre)>0:
    MyGenre = u' '
    MyGenre = Genre
    audio.add(TCON(encoding=3, text=MyGenre))
audio.save()

これは私のために働いています

于 2016-04-06T08:27:18.800 に答える