Python基础之编码

一,编码类型

1,ASCII码

  只包含英文字母,数字以及特殊字符与二进制的对应关系,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。

例如:a  01000001  一个字符一个字节表示。

2,GBK

只包含本国文字(以及英文字母,数字,特殊字符)与0101010对应关系

经实际测试和查阅文档,GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。

对于ASCII码中的内容,GBK完全沿用的ASCII码,所以一个英文字母(数字,特殊字母)用一个字节表示,而对于中文来说,一个中文用两个字节表示。

例如:

  a  01000001  ascii码中的字符:一个字符一个字节表示。

  中 01001001 01000010  中文:一个字符两个字节表示。

3Unicode: 包含全世界所有的文字与二进制0101001的对应关系。

通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。

起初:Unicode规定一个字符用两个字节表示:

  英文:  a b c  六个字节   一个英文2个字节        

  中文   中国   四个字节  一个中文用2个字节

但是这种也不行,这种最多有65535种可能,可是中国文字有9万多,所以改成一个字符用四个字节表示:.        

  a  01000001 01000010 01000011 00000001        

  b  01000001 01000010 01100011 00000001        

  中 01001001 01000010 01100011 00000001        

这样虽然解决了问题,但是又引出一个新的问题就是原本a可以用1个字节表示,却必须用4个字节,这样非常浪费资源,所以对Uniocde进行升级。

4UTF-8:包含全世界所有的文字与二进制0101001的对应关系(最少用8位一个字节表示一个字符)。

UTF-8 :最少用8位数,去表示一个字符.    

      英文:           8位,1个字节表示.    

    欧洲文字:         16位,两个字节表示一个字符.    

  中文,亚洲文字:       24位,三个字节表示. 

例如;

    a   01000001  ascii码中的字符:一个字符一个字节表示。

  To 01000001 01000010   (欧洲文字:葡萄牙,西班牙等)一个字符两个字节表示。

  中  01001001 01000010 01100011  亚洲文字;一个字符三个字节表示。

5,总结

  1,各个编码之间的二进制,是不能互相识别的,会产生乱码。
  2,文件的储存,传输,不能是unicode(只能是utf-8 utf-16 gbk,gb2312,asciid等)

6,其他知识点

1. 在计算机内存中,统一使用Unicode编码,当需要将数据保存到硬盘或者需要网络传输的时候,就转换为非Unicode编码比如:UTF-8编码。

  其实这个不用深入理解,他就是规定,举个例子:用文件编辑器(word,wps,等)编辑文件的时候,从文件将你的数据(此时你的数据是非Unicode(可能是UTF-8,也可能是gbk,这个编码取决于你的编辑器设置))字符被转换为Unicode字符读到内存里,进行相应的编辑,编辑完成后,保存的时候再把Unicode转换为非Unicode(UTF-8,GBK 等)保存到文件。

 

2. 不同编码之间,不能直接互相识别。

 

二,python3中的编码

1,str在内存中是用Unicode编码

 

对于英文:

  str:

    表现形式: s= ‘alex’

    编码方式(内部存储):01010101   以Unicode编码形式

  bytes:

    表现形式:s= b'alex'

    编码方式(内部存储):00010101   可能是以:utf-8 gbk ....

对于中文:

  str:

    表现形式: s= ‘中国’

    编码方式(内部存储):01010101   以Unicode编码形式

  bytes:

    表现形式:s = b'x\e91\e91\e01\e21\e31\e32'

    编码方式(内部存储):00010101   可能是以:utf-8 gbk ....

str-->bytes类型

# encode称作编码:将 str 转化成 bytes类型
s1 = '中国'
b1 = s1.encode('utf-8')  # 转化成utf-8的bytes类型
print(s1)  # 中国
print(b1)  # b'\xe4\xb8\xad\xe5\x9b\xbd'

s1 = '中国'
b1 = s1.encode('gbk')  # 转化成gbk的bytes类型
print(s1)  # 中国
print(b1)  # b'\xd6\xd0\xb9\xfa'

 

 bytes --> str类型

# decode称作解码, 将 bytes 转化成 str类型
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
s1 = b1.decode('utf-8')
print(s1)  # 中国

 不同编码之间,不能直接互相识别。但是可以间接保存,如下图。

 

posted @ 2020-08-10 23:08  勇敢面对difficult  阅读(201)  评论(0)    收藏  举报