Python——str字符串和unicode字符串,对于处理过中文的Python程序员来说,想必被UnicodeEncodeError和UnicodeDecodeError并不陌生。为了更好的理解Python中的编码问题,我们首先介绍一下字符编码以及Python的两种字符串类型:str和unicode之间的区别。
我们在编辑器中输入的文字,对用户来说是可读的。但是机器只能读懂01串,那怎么把我们方便阅读的符号转换成机器能读懂的01串呢?
这就需要给出符号-二进制之间的映射关系,而且必须是一一映射:即给定一个符号,机器有而且有唯一的二进制对应。根据字符得到二进制表示是编码过程(encode);根据二进制表示得到字符是解码过程(decode)。
刚开始的时候,给出了ASCII标准,用一个8bits字节来表示字符。而且这个字节实际上只用了7位,最高位是不用的,这样总共能表示128个字符。意味着ASCII字符集只有128个。
随着计算机的普及,越来越多的国家开始使用计算机。128个字符难以满足各个国家的语言需求,这促使包含更多字符的字符集诞生,并且需要采用新的编码方案。
充分利用8bits字节的高位,扩展到256个字符。
Unicode字符集包含了所有种语言的所有字符。通常用U+后接4位的16进制数字表示一个Unicode字符,比如U+FFFF。
UTF-8是针对Unicode字符集的一种编码方案。
用变长字节来表示字符:有的字符用一个字节表示(比如ASCII中规定的字符),有的字符用2个字节表示。最大长度为4字节。
上面这张图是从Wikipedia中截取的。Number of Bytes列表示字节数;Bits for code point列表示多少个bit位是真正有用的;First code point列表示该字节数表示的第一个Unicode字符;Last code point列表示对应字节数表示的最后一个Unicode字符;Byte i(i=1,2,3,4)列表示第i字节上的bit值。
以第二行为例,这一行的编码需要两个字节,其中真正有用的bit位只有11个,另5位是占位符,能表示从U+0080~U+07FF的Unicode字符。
至于具体的编码方式,我们以欧元符号。