• python字符编码


    编码,就是文字和二进制之间的一个对照表。

    ascii编码

    最早计算机诞生之初,就产生的编码,ascii规定使用1个字节来表示字母与二进制的对应关系。
    例如:

    A   01000001
    B   01000010
    
    • 1
    • 2

    总共有 2 8 = 256 2^8=256 28=256 个编码。对于一些语言是不够的。

    gb-2312编码

    gb-2312编码,由国家信息标准委员会制作(1980年)。
    gbk编码,对gb2312进行扩展,包含了中日韩等文字(1995年)。

    在与二进制做对应关系时,由如下逻辑:

    • 单字节表示,用一个字节表示对应关系。2**8 = 256
    • 双字节表示,用两个字节表示对应关系。2**16 = 65536中可能性。

    unicode

    unicode也被称为万国码,为全球的每个文字都分配了一个码位(二进制表示)。

    有两种表示方式:

    • ucs2
    用固定的2个字节去表示一个文字。
    
    00000000 00000000     悟
    ...
    
    2**16 = 65535
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • ucs4
    用固定的4个字节去表示一个文字。
    00000000 00000000 00000000 00000000  无
    ...
    2**32 = 4294967296
    
    • 1
    • 2
    • 3
    • 4
    文字     十六进制            二进制 
     ȧ        0227           1000100111
     ȧ        0227         00000010 00100111                       ucs2
     ȧ        0227         00000000 00000000 00000010 00100111     ucs4
     
     乔       4E54           100111001010100
     乔       4E54         01001110 01010100                       ucs2
     乔       4E54         00000000 00000000 01001110 01010100     ucs4
     
     😆      1F606        11111011000000110                                    
     😆      1F606                 无                                                无法用ucs2 进行表示
     😆      1F606        00000000 00000001 11110110 00000110      ucs4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    无论是ucs2和ucs4都有缺点:浪费空间。

    例如:

    文字     十六进制     二进制
    A        0041      01000001
    A        0041      00000000 01000001
    A        0041      00000000 00000000 00000000 01000001
    
    • 1
    • 2
    • 3
    • 4

    utf-8

    包含所有文字和二进制的对应关系,全球应用最为广泛的一种编码(站在巨人的肩膀上功成名就)。

    本质上:utf-8是对unicode的压缩,用尽量少的二进制去与文字进行对应。

      unicode码位范围            utf-8      
       0000 ~ 007F              用1个字节表示
       0080 ~ 07FF              用2个字节表示
       0800 ~ FFFF              用3个字节表示
      10000 ~ 10FFFF            用4个字节表示
    
    • 1
    • 2
    • 3
    • 4
    • 5

    python相关编码

    v = 'abc' # Python内部会使用unicode对abc进行处理,在进行网络传输或者内存处理的时候,需要转成字节(byte)进行处理,这时就需要使用utf-8进行编码
    
    v1 = 'test' # python 内部使用unicode ucs4进行编码,存储在硬盘时,需要将字符串转换为字节,就需要将unicode转成utf-8
    v2 = v1.encode('utf-8')
    
    • 1
    • 2
    • 3
    • 4

    例如将字符串写入到一个文件中:

    name = "hello world"  # 默认是字符串unicode编码,写入文件需要转为字节utf-8
    data = name.encode('utf-8')
    file_obj = open('log.txt', mode='wb')
    file_obj.write(data)
    file_obj.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果不进行转化name.encode('utf-8'),那么运行会报错:TypeError: a bytes-like object is required, not 'str'

  • 相关阅读:
    Oracle中的索引
    NGINX_二十 nginx 监控
    YOLO v4详解
    动态分配的分配算法——连续分配内存
    Pretrained 预训练模型的加载与使用,为什么可以把不相关的模型用过来?
    【小程序从0到1】小程序常用组件一览
    03【解构赋值】
    【Git】Git 学习笔记_操作远程仓库
    国际播客日 · 森海塞尔精选播客设备满足各类音频需求
    Python编程 元组的创建
  • 原文地址:https://blog.csdn.net/vincent_duan/article/details/125521045