赞
踩
Python 3之前,str对象只是一个简单的字符序列。base64解码后,得到的是一个字节序列:
>>> base64.b64decode('5Yac5aSr5a6J5YWo56S+5Yy6')
'\xe5\x86\x9c\xe5\xa4\xab\xe5\xae\x89\xe5\x85\xa8\xe7\xa4\xbe\xe5\x8c\xba'
这个字节序列到底是什么,取决于你的应用上下文。它可能是一个 ASCII 文本,可能是一个 UTF-8 文本,也可能是一个 GBK 文本。
如果你的终端环境或者网页环境,跟这个字节序列的编码方式一致,便可正常显示。例如,我的终端环境是 UTF-8,因此可以正常显示你解码后的字符串:
>>> print(base64.b64decode('5Yac5aSr5a6J5YWo56S+5Yy6'))
农夫安全社区
看截图,你用的应该是Windows的终端环境,编码应该是 GBK,所以你需要手工进行编码转换,从 UTF-8 换成 GBK :
>>> print(base64.b64decode('5Yac5aSr5a6J5YWo56S+5Yy6').decode('utf8').encode('gbk'))
那么,Python 3为啥不会乱码咧?——它想解决各种奇形怪状的乱码问题。Python中的str对象,不是简单的字节序列,它保存统一的Unicode码位,与编码方式无关。当你输出str对象时,Python根据终端环境编码,悄悄帮你转化成对应编码的字节序列。这样一来,终端乱码问题就得到根治。
关于文本编码相关的原理和最佳实践,可以参考我先前写的一篇文章:一文说清文本编码那些事 。如果有什么地方没有讲明白,请提出来,我再进一步完善。
洞悉文本编码本质,也就不畏惧任何乱码问题了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。