编码初识
编码初识
-
https://www.zhihu.com/question/57461614 #此大神讲的更详细
-
不同的密码本之间不能互相识别,否则会乱码
-
数据在内存中全部是Unicode编码,但是数据用于网络传输或者存储到硬盘中,必须以非Unicode编码使用utf-8或gbk等。
-
8bit == 1byte
-
'hello123': 8byte
-
编码:
-
ASCII码:只包含:英等·文字母,数字,特殊字符。(最早起的密码本)
0000 0001 : a
0000 0101 : ;
-
gbk: 英文字母,数字,特殊字符和中文。国标
一个英文字母: 0000 0001 : a 1byte
一个中文 中: 0000 0001 0100 0001 : 中 2byte
-
Unicode: 万国码:把世界上所有的文字都记录到这个密码本。
-
在Unicode标准中,我们目前使用的是UCS-4,即字符集中每一个字符的字符代码都是用4个字节来表示,其中字符代码0~127兼容ASCII字符集,一般的通用汉字的字符代码也都集中在65535之前,使用大于65535的字符代码,即需要超过两个字节来表示的字符代码是比较少的。因此,如果仍然依旧采用字符代码和字符编码相一致的编码方式,那么英语字母、数字原本仅需一个字节编码,目前就需要4个字节进行编码,汉字原本仅需两个字节进行编码,目前也需要4个字节进行编码,这对于存储或传输资源而言是很不划算的。
-
起初一个字符用2个字节表示:
0000 0001 0000 0011: a
0000 0001 0100 0001: 中
后来为了涵盖全部文字:
0000 0001 0000 0011 0000 0001 0000 0011: a
0000 0001 0100 0001 0000 0001 0000 0011: 中
缺点:浪费空间,浪费资源。
-
-
Utf-8:升级:最少用8bit1个字节表示一个字符。
-
UTF-8就是针对位于不同范围的字符代码转化成不同长度的字符编码,同时这种编码方式是以字节为单位,并且完全兼容ASCII编码,即0X00-0X7F的字符代码和字符编码完全一致,也是用一个字节来编码ASCII字符集
0000 0011 a 1字节
0000 0011 0000 0011 欧洲 2个字节
0000 0011 0000 0011 0000 0011 中: 3个字节
-
-
'中国12he' : GBK: 8个字节
'中国12he' : UTF-8: 10个字节
-
总结:
- 因此,我们可以看出,在目前全球互联的大背景下,Unicode字符集和编码方式解决了跨语言、跨平台的交流问题,同时UTF-8等编码方式又有效的节约了存储空间和传输带宽,因而受到了极大的推广应用。
-
8bit = 1byte
1024byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PBDB
1024TB = 1EB
1024EB = 1ZB
1024ZB = 1YB
1024YB = 1NB
1024NB = 1
转换:7.6MB转换成bit 7.6 * 1024 * 1024 * 8
字符代码和字符编码的区别
字符代码是特定字符在某个字符集中的序号,而字符编码是在传输、存储过程当中用于表示字符的以字节为单位的二进制序列,ASCII编码系统中,字符代码和字符编码是一致的,比如字符A,在ASCII字符集中的序号,也就是所谓的字符代码是65,存储在磁盘中的二进制比特序列是01000001(0X41,十进制也是65)
int,十进制和二进制的转换
-
二进制转换成十进制
-
# 0001 1010 q=0*2**0+1*2**1+0*2**2+1*2**3+1*2**4 print(q) l=1*2**1+1*2**3+1*2**4 print(l) 从右到左开始,数字*2**索引相加,就是十进制
-
-
十进制转二进制
- 取余数然后逆序排列,得:0010 1010(因为8bit1dyte剩余用0补齐)
编码转换
- 数据在内存中全部是Unicode编码,但是数据用于网络传输或者存储到硬盘中,必须以非Unicode编码(utf-8或gbk)。
- 内存中的数据不能直接进行存储,必须先转换成非unicode然后在进行存储
- 如果是两个非unicode编码进行转换,必须先转换成unicode然后在转换成另一种编码
- pythons数据类型在内存中是unicode编码,只有bytes在内存中是非unicode编码,所以python中的数据类型要进行存储先转换成bytes形式在进行存储(bytes只能和str进行转换所以其他类型要先转换成str在转bytes)
# str---->bytes
s1='中国'
s2=s1.encode('utf-8') #编码
print(s2,type(s2))
# bytes---->str
s3=b'\xe4\xb8\xad\xe5\x9b\xbd'
s4=s3.decode('utf-8') #解码
print(s4,type(s4))
str和bytes的区别
| str | bytes |
| ---- | ---- | ---- |
|
|
|