[PY3]——內建資料結構(5)——字串編碼

Jelly_lyj發表於2017-03-18

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')

 





相關文章