str、bytes、bytearray的区别
str
str以 unicode的呈现形式。
Unicode UTF8 ASCII的补充:
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集(Character set)是多个字符的集合。
字符集包括:ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等
ASCII编码是1个字节,而Unicode编码通常是2个字节。
UTF-8是Unicode的实现方式之一,UTF-8是它是一种变长的编码方式,可以是1,2,3个字节
意思是说如果一个字节表示不了,就用两个字节或3个字节
bytes
bytes是以二进制字节序列的形式表示。
互联网上的数据都是以二进制的方式传输。
Python2 中
>>> type(b'xxxxx')
<type 'str'>
>>> type('xxxxx')
<type 'str'>
Python3 中
>>> type(b'xxxxx')
<class 'bytes'>
>>> type('xxxxx')
<class 'str'>
从上面可以看出,
bytes是Python 3中特有的,Python 2 里不区分bytes和str。
Python3.x对中文字符支持比较好,但是Python2.x则需要在源代码中增加 "#coding:utf-8 "才能支持中文字符
python3中:
str使用encode()方法———>bytes
bytes使用decode()方法———>str
注意:编解码方式必须一样,否则会出现乱码
【decode()默认使用utf-8方式解码】
str 转换成 bytes:
In [1]: str1='人生苦短,我用Python!'
In [2]: type(str1)
Out[2]: str
In [3]: b=str1.encode()
In [4]: b
Out[4]: b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\
xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!'
In [5]: type(str1.encode())
Out[5]: bytes
In [6]: b[:6]=bytearray('生命'.encode())
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-ae77bb5aca20> in <module>()
----> 1 b[:6]=bytearray('生命'.encode())
TypeError: 'bytes' object does not support item assignment
bytes 转换成 str:
In [2]: b
Out[2]: b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\
xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!'
In [3]: type(b)
Out[3]: bytes
In [4]: b.decode()
Out[4]: '人生苦短,我用Python!'
In [5]: type(b.decode())
Out[5]: str
bytearray
bytearray和bytes不一样的地方在于,bytearray是可变的。In [2]: str1
Out[2]: '人生苦短,我用Python!'
In [3]: b1=bytearray(str1.encode())
In [4]: b1
Out[4]: bytearray(b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!')
In [5]: b1.decode()
Out[5]: '人生苦短,我用Python!'
In [6]: b1[:6]=bytearray('生命'.encode())
In [7]: b1
Out[7]: bytearray(b'\xe7\x94\x9f\xe5\x91\xbd\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!')
In [8]: b1.decode()
Out[8]: '生命苦短,我用Python!'