• Python3编码解码与数据类型转换


    一、bytes对象与字符串对象

    1.1、bytes对象与字符串对象实质

    1)、bytes对象

    python在进行数据的二进制传输时,其解释器层面都会使用bytes对象的方式传输。无论我们传输什么类型的数据,比如gbk编码类型,或者utf-8类型,最终都需要转化为bytes对象传输,这一点类似于java的class,底层都是这样的字节码。

    2)、bytes存在三种写法:

    • 单引号: b'同样允许嵌入 "双" 引号'。

    • 双引号: b"同样允许嵌入 '单' 引号"。

    • 三重引号: b'''三重单引号''', b"""三重双引号"""

    3)、str对象

    我们从网上复制来的数据,粘贴在代码中,或者从电脑的文件中读取的数据都是str对象。可以用type()函数查看其类型。而str对象传输时就需要转换成bytes对象。

    4)、str对象的写法

    • 单引号: '同样允许嵌入 "双" 引号'。

    • 双引号: "同样允许嵌入 '单' 引号"。

    • 三重引号: '''三重单引号''', b"""三重双引号"""

    1.2、bytes与str对象转换

    1)、bytes转str
    bytes存在内置函数decode(),我们使用这个函数时仅需控制decode的类型,即是将bytes按什么样的方式组织成字符串,比如按照utf-8的类型组织,就可以理解为python解释器获取010101的数据,转换成bytes后按照utf-8形式组成字符串。
    这个是bytes按照utf-8的编码将x64x6fx67转换字符串

    >f = b"x64x6fx67"
    >print(f.decode("utf-8"))
    
    >dog
    

    2)、str转bytes
    这个是字符串转换成bytes

    >c="dog"
    >print(c.encode("utf-8"))
    
    >b'dog'
    

    理解了这个实质,大部分的编码转换失败问题就可以往这两个相互转换上理解,就可以解决

    二、字符串对象的数据类型转换

    2.1、ascii串形式<-->hex字符串

    ascii串形式就是我们通常意义上理解的字符串,也包括回车等不可见字符
    hex指的是表现形式为0-f的字符串对象

    import binascii
    
    def str_to_hexStr(string):
        str_bin = string.encode('utf-8')
        return binascii.b2a_hex(str_bin).decode('utf-8') or binascii.hexlify(str_bin).decode('utf-8')
    
    def str_to_hexStr(string):
        str_bin = string.encode('utf-8')
        return binascii.a2b_hex(str_bin).decode('utf-8') or binascii.unhexlify(str_bin).decode('utf-8')
    
    
    f = "xxxxxx"
    a = str_to_hexStr(f)
    print(a)
    
    s = "787878787878"
    b = str_to_hexStr(s)
    print(b)
    
    >>>787878787878
    >>>xxxxxx
    

    一定要注意其中存在的数据对象转换

    2.2、ascii串形式<-->bin字符串

    def binToStr(binStr):
        return "".join(format(chr(int(binary_value, 2))) for binary_value in binStr.split())
    
    def strToBin(asciiStr):
        return ' '.join(format(ord(x), 'b') for x in asciiStr)
    
    print(binToStr("01100001 01100010 01100011"))
    print(strToBin("xxxxxxxxfdsd55"))
    
    >>>abc
    >>>1111000 1111000 1111000 1111000 1111000 1111000 1111000 1111000 1100110 1100100 1110011 1100100 110101 110101
    

    2.3、ascii串形式<-->base64字符串

    import base64
    
    s = "nihao"
    res = base64.b64encode(s.encode("utf-8")).decode('utf-8')
    print(res)
    
    s1 = "bmloYW8="
    res1 = base64.b64decode(s1.encode("utf-8")).decode("utf-8")
    print(res1)
    
    >>>bmloYW8=
    >>>nihao
    

    2.4、ascii串形式<-->unicode字符串

    #unicode串转ascii串,可包括中文
    s = "u006eu0069u0068u0061u006f"
    res = s.encode("unicode_escape").decode("unicode_escape")
    print(res)
    
    #中文或ascii转成unicode串
    s1 = "你好"
    def strToUnicode(asciiStr):
        return "".join(str(hex(ord((x)))).replace("0x","\u00") for x in asciiStr)
    
    print(strToUnicode(s1))
    
  • 相关阅读:
    使用Hugo框架搭建博客的过程
    使用Hugo框架搭建博客的过程
    使用Hugo框架搭建博客的过程
    Windows软件包管理工具:Scoop
    Centos8 安装ifconfig(net-tools.x86_64)
    Centos8 重启网卡方法
    使用Visual Studio 2019--调试汇编32位代码的详细步骤
    linux 三剑客之awk总结
    linux 三剑客之sed常用总结
    mysql数据库的笔记
  • 原文地址:https://www.cnblogs.com/qianxinggz/p/13428113.html
Copyright © 2020-2023  润新知