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的编码将\x64\x6f\x67转换字符串

>f = b"\x64\x6f\x67"
>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 = "\u006e\u0069\u0068\u0061\u006f"
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))
posted @ 2020-08-03 19:07  qianxinggz  阅读(378)  评论(6编辑  收藏  举报