浅议Python字符串编码、解码问题

字符串编/解码问题总是与宽字符集的表达相关,如果只限定于ASCII字符集当然是不存在此问题的。中文编码问题只是其中的一个子集而已。
对于Python,字符编解码在2.X和3.X中又稍有不同,但整体逻辑如下图所示。
浅议Python字符串编码、解码问题

Python内部使用unicode来处理字符串。
Python2.X中又str和unicode两种类型,没有bytes类型。3.X中的bytes类型可以视作str类型。unicode是没有编码类型的标准字符串形式。unicode是编解码的中间过程。
Python3.X中出现的bytes字节流从2.X字符串str类型中独立出来,str采用unicode格式存储处理字符串,取消了unicode类型。
从逻辑上说3.X在字符串编解码方面较2.X更为清晰:2.X中的str既可以encode()也可以decode(),而在3.X中str只能encode()、bytes只能decode();在3.X中str使用unicode对字符串进行统一的存储,不再有各种编码方式,如需其他编码则对其进行encode()编码操作,得到相应的字节串,这一过程的逆操作则是decode()。然而在2.X下却是含糊不清的,首先str可以保存各种编码格式的字符串,其次str既是encode()和decode()起点,也可以是它们的终点(+﹏+)~。此外,在2.X中对str进行encode()操作时,首先隐含进行了decode()操作,然后再对得到的unicode串进行编码操作。
下面在Python2.7中进行测试:
浅议Python字符串编码、解码问题
提示解码失败,因为超越ascii字符集的范围。继续试验:
浅议Python字符串编码、解码问题
由此可见,在对字符串进行编码操作时,系统将使用默认编码方式先进行解码,得到unicode之后再进行编码操作。
在Python3.6下面就更加清晰:
浅议Python字符串编码、解码问题
继续在Python2.7中对“回”字的四种写法:
浅议Python字符串编码、解码问题
在Python3.6中进行测试:
浅议Python字符串编码、解码问题
可以看到,str对象没有decode方法,重新声明unic为bytes类型。
在Python3.6中进一步测试:
浅议Python字符串编码、解码问题