This
s = u'Zåìôèðà'
print s.encode('latin1').decode('cp1251')
# Zемфира
解释: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')
Results:
debug ('cp1252', 'utf8') Zемфира
Zемфира
debug ('cp1252', 'cp1251') Zемфира
Zемфира
debug ('cp1252', 'utf8', 'cp1252', 'cp1251') Zемфира
Zемфира