目录
一、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))