python 字节编码_Python 3 – 编码/解码与字节/字符

Python 3 – 编码/解码与字节/字符

我是来自python2的python3的新手,我对unicode的基础知识有点困惑。 我读过一些很好的post,使得它更清晰,但是我看到python 3有两个方法,处理编码和解码,我不知道使用哪一个。

所以在python 3中的想法是,每个string是unicode,可以编码和存储在字节中,或再次解码回unicodestring。

但有两种方法可以做到这一点:

u'something'.encode('utf-8')会产生b'bytes' ,但bytes(u'something', 'utf-8') 。

而b'bytes'.decode('utf-8')似乎和str(b'', 'utf-8') 。

现在我的问题是,为什么有两个方法似乎做同样的事情,要么比其他(为什么?)我一直试图find在谷歌上的答案,但没有运气。

>>> original = '27岁less妇生孩子后变老' >>> type(original) >>> encoded = original.encode('utf-8') >>> print(encoded) b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81' >>> type(encoded) >>> encoded2 = bytes(original, 'utf-8') >>> print(encoded2) b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81' >>> type(encoded2) >>> print(encoded+encoded2) b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x8127\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81' >>> decoded = encoded.decode('utf-8') >>> print(decoded) 27岁less妇生孩子后变老>>> decoded2 = str(encoded2, 'utf-8') >>> print(decoded2) 27岁less妇生孩子后变老>>> type(decoded) >>> type(decoded2) >>> print(str(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81', 'utf-8')) 27岁less妇生孩子后变老>>> print(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'.decode('utf-8')) 27岁less妇生孩子后变老

它们都不比另一个好,它们完全一样。 但是,使用.encode()和.decode()是更常见的方法。 它也与Python 2兼容。

添加到Lennart Regebro的答案甚至可以使用第三种方法:

encoded3 = str.encode(original, 'utf-8') print(encoded3)

无论如何,它实际上与第一种方法完全相同。 也可能看起来第二种方法是第三种方法的语法糖。

编程语言是正式expression抽象思想的手段,由机器执行。 如果编程语言包含所需的结构,则认为它是很好的。 Python是一种混合语言 – 比纯粹的OO或纯程序语言更自然,更通用。 有时函数比对象方法更合适,有时反过来也是如此。 这取决于解决问题的心理图景。

无论如何,问题中提到的function可能是语言实现/devise的副产品。 在我看来,这是一个很好的例子,显示了技术上同样的东西的另一种思维。

换句话说,调用对象方法意味着用“让对象给我想要的结果”来思考。 调用另一个函数意味着“让外部代码处理传递的参数并提取想要的值” 。

第一种方法强调对象自己完成任务的能力,第二种方法强调单独的algorithm提取数据的能力。 有时,单独的代码可能是非常特殊的,将它作为一般方法添加到对象的类是不明智的。

要添加到以前的答案,甚至可以使用第四种方法

import codecs encoded4 = codecs.encode(original, 'utf-8') print(encoded4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值