字符编码的发展历程:
二进制
---->ASCII:只能存英文或者拉丁字符,一个字符占一个字节(一个字节八位)
-------->gb2312:只能存6700多个英文,1980年
------------>gbk1.0:存2万多个字符,1995年
---------------->gb18030:存2.7万个中文,2000年
-------------------->unicode:万国码,Unicode的表现形式是utf-32,存所有的字符都占用4个字节。
------------------------>unicode:万国码,Unicode的表现形式是utf-16,一个字符占2个字节,65535。
---------------------------->unicode:万国码,Unicode的表现形式是utf-8:可变长字节,一个英文用ASCII码来存,一个中文占3个字节。
- 编码encode
- 解码decode
编码与解码的应用示例:
- 不同国家之间的语言不同,例如说我们在中国制作一款游戏,游戏中的字幕全部是中文的形式展示,那么如果游戏后期发展需要在日本等国外上线,那么游戏在国外运行将会乱码,前期使用的解决方案是在游戏中加入日文包,或者韩文包,但是如果国家很多的话,导入的包就太多了,为了解决这个问题,我们使用的方案就是编码和解码的过程,比如说,国际上通用的语言就是英文,那么我们将国内中文版的游戏字幕编码为unicode的形式,然后外国,比如日本要上线这款游戏的话,只需要对游戏中的unicode编码进行解码,解码成日文就可以了。
- 也就是说中文和日文之间不能直接沟通,需要通过编码和解码去实现
python2中,内存里的unicode的形式默认是utf-16
python3查看系统默认编码
import sys
print(sys.getdefaultencoding())
结果:
utf-8
Process finished with exit code 0
python3编码:
import sys
print(sys.getdefaultencoding())
s = '特斯拉'
s_to_gbk = s.encode("gbk")
print(s)
print(s_to_gbk)
结果:
utf-8
特斯拉
b'\xcc\xd8\xcb\xb9\xc0\xad'
Process finished with exit code 0
- encode在进行编码的同时,会把数据转换成bytes类型
- decode在进行解码的同时(解码就是解码成unicode),会把bytes类型转换为字符串
- b = byte = 字节类型 = [0-255]