Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 诱变剂1.22编码问题_Python_String_Unicode_Encoding_Mutagen - Fatal编程技术网

Python 诱变剂1.22编码问题

Python 诱变剂1.22编码问题,python,string,unicode,encoding,mutagen,Python,String,Unicode,Encoding,Mutagen,我对诱变剂的字符编码有问题 我将dict[key]转换为Unicode,但我收到的都是错误。所讨论的字符是U+00E9或ee,但我打印的是├⌐。我假设诱变剂的默认字符集是UTF-8,但是有办法解决这个问题吗 输出: Winter Wonderland.mp3 Album : Christmas Album Artist: Michael Bubl├⌐ Artist : Michael Bubl├⌐ Composer : None Disk : None

我对诱变剂的字符编码有问题

我将
dict[key]
转换为Unicode,但我收到的都是错误。所讨论的字符是
U+00E9
ee
,但我打印的是
├⌐。我假设诱变剂的默认字符集是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)
代码:

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)
我假设诱变剂的默认字符集是UTF-8

诱变剂返回Unicode字符串,尽管它被包装在
TextFrame
对象中。当您打印该对象时,它是
text
属性到字节的隐式
str()
转换,诱变剂(任意)为该编码选择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] 如果必须,您可以使用
ctypes
直接调用Win32 API
WriteConsoleW
,但是您必须注意,只有在连接到Windows控制台时,才可以这样做,而不是任何其他类型的流,这样您就不会在其他任何地方中断。这通常是不值得的;假定Windows用户使用的是一个控制台,其中非ASCII字符一直处于中断状态。

ID3v2标记中的文本信息可以在一个控制台中进行编码。我在中没有看到指定任何类型的默认字符集,因此它可能只是返回原始标记数据——尽管项目页面说它支持Unicode。如果所有其他方法都失败了,你可以看看源代码,因为它是开源的。那么,所有这些大型wig音乐播放器都会编写专有代码,在每个操作系统上读写吗?问题不在于读取文件。(好吧,那里也有问题,但那是另一回事。)您遇到的问题纯粹与打印到Windows控制台有关。众所周知,标准Windows控制台糟糕透顶,大多数软件/语言无法可靠地将Unicode打印到其中。