Python基础之编码
一,编码类型
1,ASCII码
只包含英文字母,数字以及特殊字符与二进制的对应关系,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。
例如:a 01000001 一个字符一个字节表示。
2,GBK
只包含本国文字(以及英文字母,数字,特殊字符)与0101010对应关系
经实际测试和查阅文档,GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。
对于ASCII码中的内容,GBK完全沿用的ASCII码,所以一个英文字母(数字,特殊字母)用一个字节表示,而对于中文来说,一个中文用两个字节表示。
例如:
a 01000001 ascii码中的字符:一个字符一个字节表示。
中 01001001 01000010 中文:一个字符两个字节表示。
3,Unicode: 包含全世界所有的文字与二进制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进行升级。
4,UTF-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) # 中国
不同编码之间,不能直接互相识别。但是可以间接保存,如下图。


浙公网安备 33010602011771号