[PY3]——内置数据结构(5)——字符串编码
py2和py3中关于字符串的最大区别?
python2中只有 unicode类型
而python3中有 string bytes两种类型
关于string和bytes的区分?
1.str是文本序列、bytes是字节序列 (文本=字符)
2.字节是没有编码的、文本是有编码的(单字节编码/双字节编码):utf-8 gbk,GB18030等
3.什么是编码?
编码可以说是一种“字节的组织方式”
字符是由字节组成的,而字符的编码规定了它是如何来组织这些字节的,即如何使用字节来表示这些字符
encode( )与decode( )
# encode()用于将str ——> bytes In [1]: '卢'.encode() Out[1]: b'\xe5\x8d\xa2' In [2]: bin(0xe5) Out[2]: '0b11100101' In [3]: bin(0x8d) Out[3]: '0b10001101' In [4]: bin(0xa2) Out[4]: '0b10100010' //所以'卢'在计算机中的表示就是这些二进制 # python3字符串默认使用utf-8编码,encode('')可指定不同编码方式 In [5]: '卢'.encode('GBK') Out[5]: b'\xc2\xac' # decode()用于将bytes ——> str In [6]: b'\xe5\x8d\xa2'.decode() Out[6]: '卢'
bytes类型
# 通过b前缀(b' ')定义bytes # 除了encode外,str的操作都有对应bytes的版本, 但是传入参数也必须是bytes In [1]: b'abc'.find('b') TypeError: a bytes-like object is required, not 'str' In [2]: b'abc'.find(b'b') Out[2]: 1 # 要注意bytes的操作是按照字节来的 In [3]: len('卢'.encode()) In [3]: 3 In [4]: '卢'.encode().find(b'\xe5') Out[4]: 0 # bytes类型自身的两个操作:decode()、hex() In [6]: b.decode() Out[6]: 'abc' In [7]: b.hex() //转化为16进制 Out[7]: '616263'
bytearray类型
# bytearray是bytes的可变版本 # 使用场景:例如图片处理 # 相对于bytes来说,bytearray多了insert、append、extend、pop、remove、clear、reverse(这些原地修改的方法) # 并且可以索引操作 # 但insert、append、remove、count的参数必须是int,且范围是0-256 In [11]: b=b'abc';type(b) Out[11]: bytes In [13]: ba=bytearray(b);type(ba) Out[13]: bytearray In [15]: b[1]=b'B' TypeError: 'bytes' object does not support item assignment In [16]: ba[1]=int(b'B'.hex(),16); print(ba) Out[16]:bytearray(b'aBc')