春节刚过,今天正式上班。首先在这里给大家拜个晚年,祝大家在新年里万事如意,新春快乐。
今天我们来说一个比较老的话题,关于Python的编码和解码的问题。
首先简单的来说,编码就是把人类熟悉的语言转化成计算机可以识别的语言,即0、1状态位。而解码则刚好相反,就是把计算机
能够识别的代码(0、1)转化成人类熟悉的语言。
计算机最早是在美国发明的,因此美国人只是对自己的语言进行了编码,也就是我们熟悉的ASCII码,这种编码就是把英文字母,
包括英文字符转化成计算机语言。一个ASCII码占用一个字节,即8位bit,这样最多可以2^8=256个字符,对于英语来说足够了。
举个例子,I am Wilson,在计算机中的存储方式是0x49, 0x20, 0x61, 0x6D, 0x20, 0x57, 0x69, 0x6C, 0x73, 0x6F, 0x6E。当然
这里面还涉及大小端的问题,在此不再赘述。
- I -> 0x49
- 空格 -> 0x20
- a -> 0x61
- m -> 0x6D
- 空格 -> 0x20
- W -> 0x57
- i -> 0x69
- l -> 0x6C
- s -> 0x73
- o -> 0x6F
- n -> 0x6E
但是这样的编码对于汉语来说就有点力不从心了。汉语里汉字那么多,显然256个字符的编码是不够的,那汉字在计算机中是如
何?
为了处理汉字,国家首先设计了GB2312编码,一共收录了7445个字符,包括6763个汉字和682个其他符号。1995年又进行了
扩编,收录了21886个符号。到了2000年再次进行扩编,共收录了27484个汉字,同时还收录了藏文,满文等文字。但是每个国家都
有自己的文字,如果没有一个统一的编码格式,大家很难交流,因此出现了Unicode编码,大家都把自己的编码格式放在这个统一的
格式中,方便交流,Unicode编码使用2字节来存储符号,因此可以收录2^16 = 65535个字符。
这样编码虽然解决了各国编码统一的问题,但是每个字符要用两个字节来存储,这样存储量似乎有些太大了,特别是有些字符可以
用一个字节来存储的时候。因此为了节省计算机的存储空间,就出现了UTF-8编码。这个编码规则不再要求每个符号都用两个字节存
储,而是将所有的字符和符号进行分类:ASCII码中的内容用1个字节保存,欧洲的字符用2个字节保存,东亚的字符用3个字节保存。
这样编码对于编程来说有很大的优势,因为我们在编程时很少使用中文,绝大部分都是英文,这样做可以节省很大的计算机空间。
Python中的编码和解码
Python2中有两种字符串类型,str存bytes数据,unicode类型存unicode数据。在Python2在处理汉字时有时候会报错,这是因为Python2默认的编码格式是ASCII码,如果数据全是ASCII,那么所有转换都是正确的,但是一旦字符串中有非ASCII码,比如汉字,那么默认的解码将会失败,Python2的解释器悄悄掩盖掉了byte到unicode的转换。所以我们在文件开头位置声明#coding:utf-8,其实就是要告诉解释器,不要以默认的ASCII编码方式来解码这个文件,而是以utf-8来解码
Python3中也有两种字符串类型,str和bytes类型。str存unicode数据,bytes类型存bytes数据。Python3默认的编码方式是utf-8
Python3不会以任意隐式的方式来混用str和bytes,而是将两者区别清晰。因此你不能拼接字符串和字节包,也无法在字节包里搜索字符串。
以上就是今天的全部内容。
与您共勉