gar*_*arh 29 python unicode base64 encoding python-3.x
目的base64.b64encode()是将二进制数据转换为ASCII安全"文本".但是,该方法返回一个bytes类型的对象:
>>> import base64
>>> base64.b64encode(b'abc')
b'YWJj'
Run Code Online (Sandbox Code Playgroud)
简单地接受输出就很容易decode(),但我的问题是:base64.b64encode()返回的意义是什么,bytes而不是str?
wim*_*wim 24
base64.b64encode()函数的目的是将二进制数据转换为ASCII安全"文本"
Python不同意这一点 - base64被故意归类为二进制变换.
在Python 3中,强制分离字节和文本并禁止隐式转换是一个设计决策.Python现在对此非常严格,bytes.encode甚至不存在,因此b'abc'.encode('base64')会提高AttributeError.
语言采用的意见是bytestring对象已经被编码.将字节编码为文本的编解码器不适合这种范例,因为当你想从字节域转到文本域时,它就是一个解码.请注意,出于同样的原因,rot13编码也从标准编码列表中消失了- 它不适合Python 3范例.
还可以有一个性能参数:假设Python自动处理base64输出的解码,base64输出是由模块的C代码生成的ASCII编码二进制表示binascii,到文本域中的Python对象.如果你真的想要字节,你只需要通过再次编码为ASCII来撤销解码.这将是一次浪费的往返,一次不必要的双重否定.最好"选择加入"解码到文本的步骤.
Zer*_*eus 20
b64encode()要知道你想要对它的输出做什么是不可能的.
虽然在许多情况下您可能希望将编码值视为文本,但在许多其他情况下 - 例如,通过网络发送 - 您可能希望将其视为字节.
既然b64encode()不知道,就拒绝猜测.并且由于输入是bytes,输出保持相同类型,而不是被隐式强制转换str.
正如您所指出的,将输出解码str为直接:
base64.b64encode(b'abc').decode('ascii')
Run Code Online (Sandbox Code Playgroud)
......以及对结果的明确表述.
顺便说一句,这是值得注意的是,虽然base64.b64decode()(注:德代码,不带码)已接受str自3.3版本中,变化是一定的争议.