2013-12-06 3 views
0

У меня проблема с кодировкой символов с Mutagen.Mutagen 1.22 Кодировка Проблема

Я отправил dict[key] в Юникод, я все получаю ошибки. Этот персонаж - 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) 
+0

Текстовая информация в тегах ID3v2 может быть закодирована [несколькими способами] (http://en.wikipedia.org/wiki/Id3v2#ID3v2). Я не вижу ничего в последней документации Mutagen (http://mutagen.readthedocs.org/en/latest/), которая указывает любой набор символов по умолчанию, поэтому возможно, что он просто возвращает данные сырого тега - хотя на странице проекта говорится он поддерживает Unicode. Если все остальное не удается, вы можете взглянуть на исходный код, так как он является открытым исходным кодом. – martineau

ответ

1

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

Mutagen возвращает Unico строки, хотя они завернуты в объект TextFrame. Когда вы print, этот объект является неявным str() преобразованием свойства text в байты, а Mutagen (произвольно) выбирает 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, будут просто разбиваться все время.

+0

Значит, все эти большие музыкальные плееры пишут проприетарный код для чтения и записи в системе на одну ОС? –

+2

Проблема не в чтении файлов. (Ну, есть проблемы и там, но это совсем другая история.) Проблема, с которой вы сталкиваетесь, - это просто делать с печатью на консоли Windows. Хорошо известно, что стандартная консоль Windows отстойна, и большинство программ/языков не могут надежно печатать Unicode. – bobince

Смежные вопросы