Mutagen 1.22 Проблема с кодировкой

У меня проблема с кодировкой символов с помощью мутагена.

Я бросил dict[key] Unicode, но все, что я получаю, это ошибки. Рассматриваемый персонаж U+00E9 или же é, но то, что я печатаю ├⌐, Я предполагаю, что набор символов по умолчанию для Mutagen - UTF-8, но есть ли способ это исправить?

Выход:

Winter Wonderland.mp3
Album       : Christmas
Album Artist: Michael Bublé
Artist      : Michael Bublé
Composer    : None
Disk        : None
Encoded By  : None
Genre       : Christmas
Title       : Winter Wonderland
Track       : 17/19
Year        : 2011

Код:

#!/usr/bin/env python

import os
import re
from mutagen.mp3 import MP3

first_cap_re = re.compile('(.)([A-Z][a-z]+)')
all_cap_re = re.compile('([a-z0-9])([A-Z])')
def convertCamelCase2Underscore(name):
    s1 = first_cap_re.sub(r'\1_\2', name)
    return all_cap_re.sub(r'\1_\2', s1).lower()

def convertCamelCase2CapitalizedWords(name):
    return ' '.join([x.capitalize() for x in convertCamelCase2Underscore(name).split('_')])

def safeValue(dict, key):
    return None if key not in dict else dict[key]

class Track:
    def __init__(self, path):
        audio = MP3(path)
        self.title = safeValue(audio, 'TIT2')
        self.artist = safeValue(audio, 'TPE1')
        self.albumArtist = safeValue(audio, 'TPE2')
        self.album = safeValue(audio, 'TALB')
        self.genre = safeValue(audio, 'TCON')
        self.year = safeValue(audio, 'TDRL')
        self.encodedBy = safeValue(audio, 'TENC')
        self.composer = safeValue(audio, 'TXXX:TCM')
        self.track = safeValue(audio, 'TRCK')
        self.disk = safeValue(audio, 'TXXX:TPA')
    def __repr__(self):
        ret = ''
        fields = self.__dict__

        for k, v in sorted(self.__dict__.iteritems()):
            ret += '{:12s}: {:s}\n'.format(convertCamelCase2CapitalizedWords(k), v)
        return ret

files = os.listdir('.')

for filename in files:
    print filename
    print Track(filename)

1 ответ

Я предполагаю, что набор символов по умолчанию для Mutagen - UTF-8

Mutagen возвращает строки Unicode, хотя и завернутый в TextFrame объект. Когда ты print этот объект это неявный str() преобразование text свойство в байтах, и Мутаген (произвольно) выбирает UTF-8 для этой кодировки.

К сожалению, консоль Windows не поддерживает UTF-8[1]. Используемая кодировка варьируется, но в вашем случае вы получаете кодовую страницу US DOS 437, в которой последовательность байтов 0xC3 0xA9 представляет ├⌐ и не é, Вы можете попытаться распечатать на консоль в нужной кодировке, явно кодировав ее:

print unicode(audio['TIT2']).encode(sys.stdout.encoding)  # 'cp437'

но это все еще позволит вам печатать только символы, которые поддерживаются в этой кодовой странице. 437 хорошо для Михаэля Бубле, но не очень хорошо для 東京事変. Нет хорошего способа вывести Unicode на консоль Windows.[2]

[1] Существует кодовая страница 65001, которая должна быть UTF-8, но есть ошибки в реализации MS, которые обычно делают ее непригодной для использования.

[2] Вы можете, если нужно, вызвать Win32 API WriteConsoleW напрямую используя ctypes, но тогда вы должны позаботиться о том, чтобы делать это только тогда, когда вы подключены к консоли Windows, а не к какому-либо другому типу потока, чтобы вы не сломались нигде. Обычно это того не стоит; Предполагается, что пользователи Windows привыкли к консоли, где не-ASCII символы просто ломаются все время.

Другие вопросы по тегам