一直以来对Python2的编码都是不怎么理解,遇到问题就是encode、decode换着来,也没有想要过去彻底了解它,这几天也看了几篇文章,所以就将自己的理解记录下来,顺便也整理一下自己的理解。
这篇文章主要讲了一下几个问题:
- 字符集与字符编码;
- 字符集(字符编码)在存储以及传输的实现方式;
- Str与Unicode;
- encode与decode;
一、字符集与字符编码
字符集基本就算是我们使用的所有文字的集合外加一些常用的符号等,例如,针对ascii字符集,那么它就是英文字符a-z,A-Z,0-9外加一些常用符号的集合;
字符编码字符编码就是将字符集中的每一个字符用数字对应起来,比如,英文字母,’a’用97代替,’A’用65代替;
那么,为什么需要?字符集与字符编码呢?
因为任何数据在计算机存储都是以二进制的方式存储的,若是我们不将每个字符一一对应一个编码,那么,我们又这么存储数据与展示数据呢!
二、字符集(字符编码)在存储以及传输的实现方式
(这里为了节(bi)约(mian)篇(bao)幅(lu)只简单说一下Unicode字符集)unicode字符集是为了解决各种各样的语言导致的各种各样的字符集不兼容的问题二出现的,它的目的是给世界上所有的语言文字一个唯一的编码,这样就解决了各个字符集不兼容的问题,但是,Unicode只是一种字符编码,并没有规定它存储、传输时候的方式,这时候UTF-8就出场了。
简单地说,UTF-8就是一种实现Unicode编码的方式,当然,还有其它的实现方式,这里不再赘述,它规定了不同的字符应该用几个字节、什么样的表示方式描述它的编码,总的来说就两条规则:
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。
对于n字节的符号,第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
具体如下:
三、Str与Unicode
在Python2中,str类型其实字节串,Unicode类型才是真正的字符串,例如:
var = '学'
type(var)#output:<type 'str'>
repr(var)#output:"'\\xe5\\xad\\xa6'"
var = u'学'
type(var)#output:<type 'unicode'>
repr(var)#output:"u'\\u5b66'"
四、encode与decode
encode就是将字符以某种字符集的实现方式进行编码,例如,想要将中文的’学’字以UTF-8的方式存储,那么我们可以如下操作:
var = u'学'
tmp = var.encode('utf-8')
print tmp #output:'\xe5\xad\xa6'
注意:最好使用unicode字符来encode,这样可以避免很多麻烦;
decode就是将编码的字节串解码诚Unicode,如下:(接上面部分)
var = u'学'
tmp = var.encode('utf-8')
print tmp #output:'\xe5\xad\xa6'
tmp.deocde('utf-8')#output:u'\u5b66'
print tmp.deocde('utf-8')#output:'学'