python中base64 decode_python2解码base64中文乱码怎么解决?

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根据终端环境编码,悄悄帮你转化成对应编码的字节序列。这样一来,终端乱码问题就得到根治。

关于文本编码相关的原理和最佳实践,可以参考我先前写的一篇文章:一文说清文本编码那些事 。如果有什么地方没有讲明白,请提出来,我再进一步完善。

洞悉文本编码本质,也就不畏惧任何乱码问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值