0

我在使用 Mutagen 进行字符编码时遇到问题。

我将其dict[key]转换为 Unicode,但我收到的只是错误。有问题的字符是U+00E9or é,但我打印的是├⌐. 我假设 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)
4

1 回答 1

1

我假设 Mutagen 的默认字符集是 UTF-8

Mutagen 返回 Unicode 字符串,尽管包装在一个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 对 Michael Bublé 来说还可以,但对东京事変来说不是很好。没有一种将 Unicode 输出到 Windows 控制台的好方法。[2]

[1] 代码页 65001 应该是 UTF-8,但在 MS 实现中存在通常使其无法使用的错误。

[2] 如果必须,您可以WriteConsoleW直接使用调用 Win32 API ctypes,但是您必须注意仅在连接到 Windows 控制台而不是任何其他类型的流时才这样做,这样您就不会到处中断别的。这通常不值得;假定 Windows 用户习惯于非 ASCII 字符一直中断的控制台。

于 2013-12-08T15:22:54.793 回答