编码回顾:编码的种类
ASCII 占1个字节,只支持英文
GB2312 占2个字节,支持6700+汉字
GBK GB2312的升级版,支持21000+汉字
Shift-JIS 日本字符
由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,即:仅涵盖本国字符,无其他国家字符的对应关系。应运而生出现了万国码,他涵盖了全球所有的文字和二进制的对应关系,
Unicode 2-4字节 已经收录136690个字符,并还在一直不断扩张中...
Unicode 起到了2个作用:
Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
unicode包含了跟全球所有国家编码的映射关系
由于计算机的内存比较大,并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那么增加1倍将是无法容忍的!!!
为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间!
UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
UTF-32: 使用4个字节表示所有字符;
总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。
二进制、十进制、十六进制 二进制:01 八进制:01234567 十进制:0123456789 十六进制:0123456789abcdef
>>> chr(35) #ASCII码数字对应的值
'#'
>>> chr(50) #ASCII码数字对应的值
'2'
>>> bin(2) #二进制的2
'0b10'
>>> hex(2) #16进制的2
'0x2'
>>> bin(100) #二进制的
'0b1100100'
>>> hex(100) 16进制的
'0x64'
八进制
>>> oct(0)
'0o0'
>>> oct(1)
'0o1'
>>> oct(7)
'0o7'
>>> oct(8)
'0o10'
>>> oct(9)
'0o11'
十六进制
0x前缀或者BH后缀都代表16进制
>>> hex(0)
'0x0'
>>> hex(1)
'0x1'
>>> hex(9)
'0x9'
>>> hex(10)
'0xa'
>>> hex(15)
'0xf'
>>> hex(16)
'0x10'
>>> s = '中国'
>>> s.encode('gbk')
b'\xd6\xd0\xb9\xfa'
>>> s.encode('utf8')
b'\xe4\xb8\xad\xe5\x9b\xbd'
#------------------------------------
中:在unicode里是G0-5650
国:在unicode里是G0-397A
#------------------------------------
GBK里 中:d6d0
d6 转 二进制
d 6
8 4 2 1 8 4 2 1
1 1 0 1 0 1 1 0
去掉二进制的第一位(16进制每4位占一个字节)
0 1 0 1 0 1 1 0 = 0+4+2+1=5 0+4+2+1=6
#-------------------------------------------
d0 转 二进制
d 0
8 4 2 1 8 4 2 1
1 1 0 1 0 0 0 0
去掉二进制的第一位
0 1 0 1 0 0 0 0 = 0+4+2+1=5 0+0+0+0=0
#-------总结:中:d6d0(GBK)转为16进制后,去掉首位、得出5650根据unicode对应关系表找到的为中这个字