Python 如何解码cp1252字符串?

Python 如何解码cp1252字符串?,python,python-2.7,unicode,encoding,eyed3,Python,Python 2.7,Unicode,Encoding,Eyed3,我得到一个带有eyeD3的mp3标签(ID V1),我想了解它的编码。以下是我尝试的: >>> print(type(mp3artist_v1)) <type 'unicode'> >>> print(type(mp3artist_v1.encode('utf-8'))) <type 'str'> >>> print(mp3artist_v1) Zåìôèðà >>> print(mp3arti

我得到一个带有eyeD3的mp3标签(ID V1),我想了解它的编码。以下是我尝试的:

>>> print(type(mp3artist_v1))
<type 'unicode'>

>>> print(type(mp3artist_v1.encode('utf-8')))
<type 'str'>

>>> print(mp3artist_v1)
Zåìôèðà

>>> print(mp3artist_v1.encode('utf-8').decode('cp1252'))
Zåìôèðà 

>>> print(u'Zемфира'.encode('utf-8').decode('cp1252'))
Zемфира
但是它没有帮助,因为我应该先用一个字符集编码,然后用另一个字符集解码

s = u'Zåìôèðà'
print s.encode('latin1').decode('cp1251')
# Zемфира
说明:
Zå236;èèèèa
被错误地视为unicode字符串,而实际上它是一个字节序列,在cp1251中表示
Zèèèфèèa
。通过应用
encode('latin1')
我们将这个“unicode”字符串转换回字节,使用码点数作为字节值,然后将这些字节转换回unicode,告诉解码器我们使用的是cp1251

至于自动解码,以下暴力方法似乎适用于您的示例:

import re, itertools

def guess_decode(s):
    encodings = ['cp1251', 'cp1252', 'utf8']

    for steps in range(2, 10, 2):
        for encs in itertools.product(encodings, repeat=steps):
            r = s
            try:
                for enc in encs:
                    r = r.encode(enc) if isinstance(r, unicode) else r.decode(enc)
            except (UnicodeEncodeError, UnicodeDecodeError) as e:
                continue
            if re.match(ur'^[\w\sа-яА-Я]+$', r):
                print 'debug', encs, r
                return r

print guess_decode(u'Zемфира')
print guess_decode(u'Zåìôèðà')
print guess_decode(u'ZåìôèðÃ\xA0')
结果:

debug ('cp1252', 'utf8') Zемфира
Zемфира
debug ('cp1252', 'cp1251') Zемфира
Zемфира
debug ('cp1252', 'utf8', 'cp1252', 'cp1251') Zемфира
Zемфира

非常感谢。有了这个帮助,我刚刚为Picard mp3 tagger编写了一个基本插件,用于解码损坏的西里尔语标记。
debug ('cp1252', 'utf8') Zемфира
Zемфира
debug ('cp1252', 'cp1251') Zемфира
Zемфира
debug ('cp1252', 'utf8', 'cp1252', 'cp1251') Zемфира
Zемфира