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 APIWriteConsoleW
,但是您必须注意,只有在连接到Windows控制台时,才可以这样做,而不是任何其他类型的流,这样您就不会在其他任何地方中断。这通常是不值得的;假定Windows用户使用的是一个控制台,其中非ASCII字符一直处于中断状态。ID3v2标记中的文本信息可以在一个控制台中进行编码。我在中没有看到指定任何类型的默认字符集,因此它可能只是返回原始标记数据——尽管项目页面说它支持Unicode。如果所有其他方法都失败了,你可以看看源代码,因为它是开源的。那么,所有这些大型wig音乐播放器都会编写专有代码,在每个操作系统上读写吗?问题不在于读取文件。(好吧,那里也有问题,但那是另一回事。)您遇到的问题纯粹与打印到Windows控制台有关。众所周知,标准Windows控制台糟糕透顶,大多数软件/语言无法可靠地将Unicode打印到其中。