Python 3 - Encode/Decode vs Bytes/Str
我是python3的新手,来自python2,我对unicode基础知识有点困惑。
我已经阅读了一些好的帖子,这使得它更加清晰,但是我看到python 3上有2个方法,它们处理编码和解码,我不确定使用哪个方法。
所以python 3中的想法是,每个字符串都是unicode,可以编码并以字节存储,或者再次解码回unicode字符串。
但有两种方法可以做到:
并且
现在我的问题是,为什么有两种方法似乎做同样的事情,并且要么比另一种更好(为什么?)我一直试图在谷歌上找到答案,但没有运气。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | >>> original = '27岁少妇生孩子后变老' >>> type(original) <class 'str'> >>> 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) <class 'bytes'> >>> 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) <class 'bytes'> >>> 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岁少妇生孩子后变老 >>> decoded2 = str(encoded2, 'utf-8') >>> print(decoded2) 27岁少妇生孩子后变老 >>> type(decoded) <class 'str'> >>> type(decoded2) <class 'str'> >>> 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岁少妇生孩子后变老 >>> 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岁少妇生孩子后变老 |
两者都不比另一个更好,它们完全相同。但是,使用
添加到Lennart Regebro的答案甚至可以使用第三种方法:
1 2 | encoded3 = str.encode(original, 'utf-8') print(encoded3) |
无论如何,它实际上与第一种方法完全相同。它也可能看起来第二种方式是第三种方法的语法糖。
编程语言是一种正式表达抽象概念的方法,由机器执行。如果编程语言包含人们需要的结构,那么它被认为是好的。 Python是一种混合语言 - 即比纯OO或纯过程语言更自然,更通用。有时函数比对象方法更合适,有时反之亦然。这取决于解决问题的心理图像。
无论如何,问题中提到的功能可能是语言实现/设计的副产品。在我看来,这是一个很好的例子,显示了技术上相同的另类思考。
换句话说,调用对象方法意味着用"让对象给我想要的结果"来思考。调用函数作为替代意味着"让外部代码处理传递的参数并提取所需的值"。
第一种方法强调对象自己完成任务的能力,第二种方法强调单独算法提取数据的能力。有时,单独的代码可能非常特殊,因此将它作为一般方法添加到对象的类是不明智的。
要添加以添加到上一个答案,甚至可以使用第四种方法
1 2 3 | import codecs encoded4 = codecs.encode(original, 'utf-8') print(encoded4) |