编码初识

编码初识

  • 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 |
| ---- | ---- | ---- |
|

unicode编码
|
非unicode编码
| |
|
文字文本(主要人类操作)
|
字节文本(主要计算机操作)
| |
|
用于存储少量数据
|
网络传输,二进制图片和文件的保存等等
| |

posted @ 2021-06-03 12:16  刘家小仙女  阅读(219)  评论(0编辑  收藏  举报