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 символы просто ломаются все время.