一、字符串编码和解码方法
在Python3
中,默认写的字符串都是unicode
类型,unicode
是一个万能的字符集,可以存储任意的字符,但是unicode
字符串只能在内存中存在,不能在磁盘和网络间传输数据,如果要在文件或者网络间传输数据,必须要将unicode
转换为bytes
类型的字符串,因此我们在写代码的时候有时候要对unicode
和bytes
类型字符串进行转换,转换的函数如下:
-
encode('utf-8')
:将unicode
编码成bytes
类型,并且编码方式采用的是utf-8
。
list_1 = 'Welcome To Beijing 小明'
print(list_1.encode('utf-8'))
b'Welcome To Beijing \xe5\xb0\x8f\xe6\x98\x8e'
-
decode('utf-8')
:将bytes
解码成unicode
类型,并且解码的方式采用的是utf-8
。
text=b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a \xe5\xb0\x8f\xe6\x98\x8e'
print(text.decode('utf-8'))
你好啊 小明
二、ASCII、GBK、Unicode和UTF-8编码之间的关系
- ASCII:由于历史原因,在Python2版本中,默认的字符串编码采用的是ascii编码(Python早于unicode发布)。而ascii编码是采用1个字节来存储,也就是8位,最多只能表示2^8也即256个字符,这在全世界远远是不够的,单拿中国汉字来讲,常用的汉字也有6000多个。
- GBK:对于拉丁语系国家来说通过扩展最高位,单字节表示所有的字符已经绰绰有余,但是对于亚洲国家来说一个字节就显得捉襟见肘了。于是中国人自己弄了一套叫 GB2312 的双字节字符编码,又称GB0,1981 由中国国家标准总局发布。GB2312 编码共收录了6763个汉字,同时他还兼容 ASCII,不过 GB2312 还是不能100%满足中国汉字的需求,对一些罕见的字和繁体字 GB2312 没法处理,后来就在GB2312的基础上创建了一种叫 GBK 的编码,GBK 不仅收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。同样 GBK 也是兼容 ASCII 编码的,对于英文字符用1个字节来表示,汉字用两个字节来标识。
- unicode:GBK仅仅只是解决了中国自己的问题,但是计算机不止是美国人和中国人用,全世界还有很多国家存在此类问题,于是,为了满足全球各个国家不同语言的编码需求,全球统一码联盟提出了unicode编码。unicode编码默认情况下会采用2个字节存储字符(UCS-2),这样能够存储的2^16也即65536个字符,但也还是不能满足全世界所有语言,因此后来又补充了用4个字节存储(UCS-4),这就可以包含全球所有的文字了。
- UFT-8:虽然unicode包含了全球所有的文字,但是它也带来了问题,因为Unicode将大部分的字符都用2个字节存储,但是对于英文字母,比如a,其实他只需要一个字节就够了,如果都用2个字节存储,那么比较浪费硬盘空间或者浪费流量,因此unicode并不适合用来存储。而utf-8则是unicode的一种实现方式,他默认会使用8位,也就是一个字节存储,如果存储不下了,则会动态的改变大小用来存储字符。因此utf-8比较节省空间,并且也可以包含全世界所有的字符。
网友评论