编码基础:
众所周知,计算机只可以存储和处理二进制数据,所以各种文字、字母、符号如果被计算机识别的话,中间需要有一道对应关系,于是便有了ASCII(美国标准信息交换代码),ASCII使用7位二进制数标记了128(2^7)个字符(符号、字母、控制符等),由于1字节=8位,所以最高位补个0,凑够8位以方便计算和处理。
接着,拉丁语系的技术宅们发现,这128个字符的高位空着的,那么干脆用来表示拉丁语系的主要符号吧!还是使用单字节,但是可以表示的字符数量增加了一倍。这套编码叫做latin-1(iso-8859-1)。
这些宅男们没有想到,区区一个字节256个符号,对于东亚国家来讲,简直呵呵了。拿中文为例,仅常用字符就几千个,于是中国国家标准总局制定了一套中文编码——GB2312。GB2312通过两个字节表示一个汉字,且最高位为0的部分兼容ASCII,最高位为1的部分则通过连续的两个字节表示一个中文字。后来又出现了兼容GB2312的GBK编码。
到这里,依然面临了一个问题:GB2312或者GBK编码中,仅可以表示汉字和英文字符,无法做到多语言文字同时表示。这时候,Unicode(又称万国码)出现了。Unicode采用32位二进制(4字节)表示一个字符,这样便可以一套编码对应多种不同语言。Unicode是一种编码,它的作用是指定字符到二进制数之间的对应关系。但是对于存储和传输,Unicode有几种不同的实现,比较常用的是UTF-8、UTF-16、UTF-32。UTF-32中,每个字符固定占4字节,按照Unicode编码完全映射。而UTF-8和UTF-16则属于变长编码,分别使用最少1个(UTF-8)或2个(UTF-16)字节到最多4个字节来编码。
Python源码中的编码:
现在大部分的Python第三方库对于Python2.X版本是支持的,所以Python2.X是现在的主流解释器。Python2.X解释器默认将源码认作ASCII编码格式。如果不在首行显式指定编码,则无法在源码中出现非ASCII字符。常用的指定源码的编码格式:
# coding=<coding name> #平常写代码使用 or # _*_ coding:utf-8 _*_ #较为正式
Python3.X解释器默认将源码认作UTF-8编码,所以使用此版本解释器时,不需要显式的指定编码,对于中文Print之后也是正常显示的。
Python中的编码:
Python2.X中两个常用的表示字符串的类型:str、unicode;
对于str类型,我们可以将它理解为一个存储二进制内容的容器。如果这类字符串,我们遍历其中每一个元素的时候,对于二进制编码的字符是正常显示的,而其他的则不会正常显示。
对于Unicode类型,Python在存储和使用时默认是UTF-8编码。这类字符串在创建时,会在前面加上一个U来标记,我们对其进行遍历时,所有的字符都会正常显示。
而对于这两种类型字符串可以进行相互转换,decode将str解析为Unicode;encode将Unicode解析为str。
Python3.X中两个常用的表示字符串的类型:str、byte;
str类型就如同Python2.X中的Unicode类型一样使用。同样这两种类型之间也是可以相互转换的,decode将byte解析为str;encode将str解析为byte。对于str类型遍历全部字符正常显示,下列代码可直接复制粘贴进行测试。
A = '宝宝的宝宝是不是宝宝的宝宝,如果宝宝的宝宝不是宝宝的宝宝,那可真是吓死宝宝了' for a in A: print(a) B = A.encode() print(B) C = B.decode() print(C)
注意:关于Python2.X和3.X版本的不同在这里不予深究,但是在平常使用中注意以下几点说明:
1、3.X较2.X性能要慢一些,还存在较大的优化空间;
2、3.X默认是Unicode编码中的UTF-8变长编码,无需显式指定编码;
3、在语法上去除了<>,改用!=
去除了Print语句,加入了Print()
关键字加入了as和with,还有True、False、None
友情技术博客链接:
https://zhuanlan.zhihu.com/p/20612337
http://www.cnblogs.com/codingmylife/archive/2010/06/06/1752807.html