• Python - 字符串编解码



    关于编解码

    编码/解码本质上是一种映射
    字符a 用 ascii 编码则是65,计算机中存储为 00110101。
    a 需要解码为 00110101,才能被计算机使用。

    编码:真实字符与二进制串的对应关系,真实字符 → 二进制串
    解码:二进制串与真实字符的对应关系,二进制串 → 真实字符

    如:
    UTF-8 --> decode 解码 --> Unicode
    Unicode --> encode 编码 --> GBK / UTF-8 等


    编码的种类

    • ASCII 占 1个字节,只支持英文
    • GB2312 占2个字节,支持 6700+ 汉字
    • GBK GB2312的升级版,支持 21000+ 汉字,中文2个字节。
    • Unicode 2-4 字节, 已经收录 136690 个字符
    • UTF-8:使用 1、2、3、4 个字节表示所有字符;
      优先使用1个字符、无法满足则使增加一个字节,最多 4个字节。
      英文占1个字节、欧洲语系占2个、东亚占 3个,其它及特殊字符占 4个,中文 3个字节。
    • UTF-16:使用2、4个字节表示所有字符;
      优先使用2个字节,否则使用4个字节表示。

    ASCII 以 1字节 8个bit位表示一个字符,首位全是0,表示的字符集明显不够

    unicode 编码系统是为表达任意语言而设计的,为了防止存储上的冗余(比如,对应ascii码的部分),其采用了变长编码,但变长编码给解码带来了困难,无法判断是几个字节表示一个字符

    UTF-8 是针对unicode变长编码设计的一种前缀吗,根据前缀可判断是几个字节表示一个字符


    Python 中的默认编码

    • Python2 中默认是ASCII码
    • Python3 中默认是unicode

    代码实现编解码


    常用字符串–字节转换

    str = '你好'  # b'\xe4\xbd\xa0\xe5\xa5\xbd'   gbk:b'\xc4\xe3\xba\xc3'
    str = 'abc'  # b'abc'
    str = 'นั่ง'   # b'\xe0\xb8\x99\xe0\xb8\xb1\xe0\xb9\x88\xe0\xb8\x87'
    str = 'นั่'  # b'\xe0\xb8\x99\xe0\xb8\xb1\xe0\xb9\x88'
    # str = 2 # 'int' object has no attribute 'encode'
    str = '*' # b'*'
    
    a = str.encode('UTF-8')
    a = str.encode('gbk')
    
    # 中文不支持 ascii 编码
    >>> str = 'abc123'
    >>> str.encode('ascii') 
    b'abc123'
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    字节样式字符串 编解码

    bytes 样式类型 主要在于使用 raw_unicode_escape 编码
    unicode 样式类型 主要在于使用 unicode_escape 编码

    str = '\xe5\x90\x8d\xe7\xa7\xb0'
    str_b = str.encode("raw_unicode_escape") # b'\xe5\x90\x8d\xe7\xa7\xb0'
    str_origin = str_b.decode("utf-8")  # '名称'
    
    • 1
    • 2
    • 3

    >>> u_code = 'abc你好123'.encode('unicode-escape') 
    
    >>> u_code, type(u_code)
    (b'abc\\u4f60\\u597d123', <class 'bytes'>)
    
    >>> u_str = 'abc\u4f60\u597d123'
    >>> u_b = u_str.encode('unicode-escape')
    >>> u_b, type(u_b) 
    (b'abc\\u4f60\\u597d123', <class 'bytes'>)
    
    ... str2 = u_b.decode('utf-8')  
    >>> str2, type(str2) 
    ('abc\\u4f60\\u597d123', <class 'str'>)
    
    >>> str3 = str2.encode()
    >>> str3, type(str3) 
    (b'abc\\u4f60\\u597d123', <class 'bytes'>)
    
    >>> str4 = str3.decode('unicode-escape')
    >>> str4, type(str4) 
    ('abc你好123', <class 'str'>)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    url 编解码

    使用 urllib 库
    参考: https://www.cnblogs.com/miaoxiaochao/p/13705936.html


    str = '你好'
    a = urllib.parse.quote(str) 
    print(a) # %E4%BD%A0%E5%A5%BD
    
    
    b = urllib.parse.unquote(a) # 你好
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    字节相加

    b = b''
    b += b'a'
    b += b' b'
    
    print(b) b'a b'
    print (b.decode('utf-8')) # a b
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    伊织 2022-06-24(五)

  • 相关阅读:
    RAC_11g重启顺序以及常用管理命令
    嵌入式学习的第二天
    【SOPHON】算能盒子SE-16的C++模型转换
    linux安装elasticsearch-head (es可视化界面)
    二十一、C位域
    C++中 while循环和for循环优缺点
    计算机网络_2.2物理层下面的传输媒体
    java计算机毕业设计高校疫情管理源码+数据库+系统+lw文档+mybatis+运行部署
    springcloud五大组件
    2024黑马AI+若依框架项目开发 个人心得、踩坑和bug记录 全网最快最全 基础功能认识篇
  • 原文地址:https://blog.csdn.net/lovechris00/article/details/125452346