Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 25, 2016 15:56:05

AxaRu
Зарегистрирован: 2015-04-11
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Старая песня про кодировки. Помогите разобраться.

Нужно прочитать теги mp3 файлов и перекодировать их в utf8

Есть “audiobook_cp1251.mp3” файл с тегами в кодировке “ср1251”
С помощью программы mid3iconv читаю теги:

$ mid3iconv -p -d "audiobook_cp1251.mp3"
Updating audiobook_cp1251.mp3
COMM=='dou'=The Black Box Publishing, NOT FOR SALE
http://www.realmusic.ru/black_box
TALB=Ñòàðàÿ Äîáðàÿ Ñàé Ôàé
TCON=audiobook
TDRC=2011
TIT2=Îïåðàöèÿ 'Âîíþ÷êà'
TPE1=Êëèôôîðä Ñàéìàê
TRCK=70
Читаю теги из того же файла с одновременным преобразованием из cp1251
$ mid3iconv -e CP1251 -p -d "audiobook_cp1251.mp3"
Updating audiobook_cp1251.mp3
COMM=='dou'=The Black Box Publishing, NOT FOR SALE
http://www.realmusic.ru/black_box
TALB=Старая Добрая Сай Фай
TCON=audiobook
TDRC=2011
TIT2=Операция 'Вонючка'
TPE1=Клиффорд Саймак
TRCK=70

Пытаюсь прочитать теги в pythone с помощью библиотеки TinyTag.

$ python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tinytag import TinyTag
>>> tag = TinyTag.get('audiobook_cp1251.mp3')
>>> tag.artist
'Êëèôôîðä Ñàéìàê'
>>> tag.artist.encode('utf8')
b'\xc3\x8a\xc3\xab\xc3\xa8\xc3\xb4\xc3\xb4\xc3\xae\xc3\xb0\xc3\xa4 \xc3\x91\xc3\xa0\xc3\xa9\xc3\xac\xc3\xa0\xc3\xaa'
Читается естественно кракозябы. Пытаюсь перевести в utf8 - сами видите что.

А из файла, где tags с кодировкой utf8, естественно все читается нормально
>>> tag = TinyTag.get('audiobook_2.mp3')
>>> tag.artist
'Арльд Роберто'

Подскажите, как мне правильно преобразовать tag из cp1251?

Отредактировано AxaRu (Янв. 25, 2016 16:13:02)

Офлайн

#2 Янв. 25, 2016 16:16:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Старая песня про кодировки. Помогите разобраться.

>>> s = 'Êëèôôîðä Ñàéìàê'
>>> s.encode('latin1').decode('cp1251')
'Клиффорд Саймак'
>>>



Офлайн

#3 Янв. 25, 2016 16:29:53

AxaRu
Зарегистрирован: 2015-04-11
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Старая песня про кодировки. Помогите разобраться.

py.user.next, спасибо огромное.
Если не трудно поясните пожалуйста, как это работает?
Почему в байтовый массив нужно преобразовывать с аргуменом ‘latin1’?
Правильно я понимаю, что конструкция encode('latin1') “говорит” интерпретатору считать строку байтовым массивом, не преобразовывая символы в другую кодировку?

Отредактировано AxaRu (Янв. 25, 2016 16:32:34)

Офлайн

#4 Янв. 25, 2016 19:21:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Старая песня про кодировки. Помогите разобраться.

AxaRu
Почему в байтовый массив нужно преобразовывать с аргуменом ‘latin1’?
latin1 - кодирует первые 256 кодовых точек юникода.
Если в строке питона находятся только однобайтовые символы, то можно напрямую получить их коды, используя кодировку latin1.

То есть это равносильно тому, чтобы просто получить код каждого символа в строке.
>>> s = 'Êëèôôîðä Ñàéìàê'
>>> list(map(ord, s))
[202, 235, 232, 244, 244, 238, 240, 228, 32, 209, 224, 233, 236, 224, 234]
>>> bytes(list(map(ord, s)))
b'\xca\xeb\xe8\xf4\xf4\xee\xf0\xe4 \xd1\xe0\xe9\xec\xe0\xea'
>>> s.encode('latin1')
b'\xca\xeb\xe8\xf4\xf4\xee\xf0\xe4 \xd1\xe0\xe9\xec\xe0\xea'
>>> list(s.encode('latin1'))
[202, 235, 232, 244, 244, 238, 240, 228, 32, 209, 224, 233, 236, 224, 234]
>>>



Отредактировано py.user.next (Янв. 25, 2016 19:22:22)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version