如何解码cp1252字符串?

LA_*_*LA_ 3 python unicode encoding python-2.7 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(mp3artist_v1.encode('utf-8').decode('cp1252'))
Zåìôèðà 

>>> print(u'Z??????'.encode('utf-8').decode('cp1252'))
Zемфира
Run Code Online (Sandbox Code Playgroud)

如果我使用在线工具对值进行解码,则表示Zемфира可以Z??????通过更改编码将值转换为正确的值,CP1252 ? UTF-8Zåìôèðà通过更改编码(如)来将值转换为正确的值CP1252 ? CP1251

我应该怎么做才能Z??????mp3artist_v1.encode('cp1252').decode('cp1251')效果很好,但我怎么能自动理解可能的编码(仅3编码是可能的- ,cp1251cp1252utf-8我正打算使用下面的代码:

def forceDecode(string, codecs=['utf-8', 'cp1251', 'cp1252']):
    for i in codecs:
        try:
            print(i)
            return string.decode(i)
        except:
            pass
    print "cannot decode url %s" % ([string]) 
Run Code Online (Sandbox Code Playgroud)

但这无济于事,因为我应该先使用一个字符集进行编码,然后再使用另一个字符集进行解码。

geo*_*org 5

这个

s = u'Zåìôèðà'
print s.encode('latin1').decode('cp1251')
# Z??????
Run Code Online (Sandbox Code Playgroud)

说明:Zåìôèðà被错误地视为unicode字符串,而实际上是一个字节序列,Z??????在cp1251中表示。通过应用,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')
Run Code Online (Sandbox Code Playgroud)

结果:

debug ('cp1252', 'utf8') Z??????
Z??????
debug ('cp1252', 'cp1251') Z??????
Z??????
debug ('cp1252', 'utf8', 'cp1252', 'cp1251') Z??????
Z??????
Run Code Online (Sandbox Code Playgroud)