теги mutagen и id3 - путаница в кодировке символов - PullRequest
1 голос
/ 28 августа 2011

Я столкнулся с проблемой при чтении некоторых тегов 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строки, чтобы я мог поместить их в свою базу данных.Хотя это всего лишь один пример, я думаю, что я, вероятно, столкнусь с некоторыми другими файлами с совершенно разными кодировками, поэтому я ищу хорошее универсальное решение.Только исправление этого действительно помогло бы мне встать на путь.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 28 августа 2011

Добро пожаловать в увлекательный мир кодирования.

На этом шаге:

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

... вы получите строку байта в юникоде. Во второй строке Python выводит репрезентацию ASCII этой байтовой строки, поэтому вы видите шестнадцатеричные значения. Вам нужно, чтобы Python взял эту байтовую строку и кодировал , используя одну из доступных кодировок символов. Это было источником путаницы для меня тоже. Просто помните, что вы декодируете из символов в шестнадцатеричные значения и кодируете шестнадцатеричные значения в символы.

Итак, если вы сделаете это:

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

... вы видите правильный результат. Итак, как только вы действительно что-то сделаете с новым закодированным текстом, вы увидите, что он представлен так, как вы хотите. Печать в консоль, запись в файл или отображение в графическом виджете должны выглядеть нормально.

0 голосов
/ 06 апреля 2016
if len(Genre)>0:
    MyGenre = u' '
    MyGenre = Genre
    audio.add(TCON(encoding=3, text=MyGenre))
audio.save()

Это работает для меня

...