python2和python3的字符串前缀比较。b加字符串、u加字符串、r加字符串和没有前缀

发表于:
来源:阿酷技术学习
作者:simplefastbest

首先我们应该知道:在python中字符串表示的意义:一种是字节字符串,一种是unicode字符串。

在python2中字节字符串表示方法:

> a='阿酷技术学习'
> type(a)
<type 'str'>
> len(a)
12

这个a就是一个字节字符串。从长度就可以看出读得是字节数。

b作为前缀也表示一个字节字符串:

> b=b'阿酷技术学习'
> len(b)
12
> type(b)
<type 'str'>
> a='阿酷技术学习'
> a==b
True

在python2中unicode字符串表示方法:

> a=u'阿酷技术学习'
> type(a)
<type 'unicode'>
> len(a)
6

u作为前缀的字符串就是一个unicode字符串。

在python2中字节字符串转化为unicode字符串

> a='阿酷技术学习'
> u=a.decode('gb2312')
> type(u)
<type 'unicode'>
> len(u)
6

在python2中unicode字符串转化为字节字符串

> c=u.encode('utf8')
> type(c)
<type 'str'>
> len(c)
18

由以上可以看出,在python2中,虽然没有字节字符串的定义,但是我们可以认为没有任何前缀的字符串就是字节字符串。。

在python3中有很大改变,我专门装了一个virtualenv,测试了一下。

在python3中.

> a='阿酷技术学习'
> type(a)
<class 'str'>
> len(a)
6
> b=u'阿酷技术学习'
> type(b)
<class 'str'>
> len(b)
6
> a==b
True

这说明在python3中class str就表示python2中的unicode字符串。没有任何前缀的字符串与u加字符串表示一样的意义,都是unicode字符串。

> c=b'阿酷技术学习'
  File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
> c=b'ab'
> type(c)
<class 'bytes'>

当我像python2中这样写时,报错。bytes仅能包含ASCII文本字符。而且在python3中提出了一个bytes类。

> a=u'阿酷技术学习'
> b=a.encode('utf8')
> b
b'\xe9\x98\xbf\xe9\x85\xb7\xe6\x8a\x80\xe6\x9c\xaf\xe5\xad\xa6\xe4\xb9\xa0'
> len(b)
18
> type(b)
<class 'bytes'>

这说明在python3中unicode字符串仍是通过encode表示字节字符串。而且字节字符串可以包含十六进制

> c=b.decode('utf8')
> c
'阿酷技术学习'
> type(c)
<class 'str'>
> len(c)
6

在python3中decode方法把字节字符串转化成unicode字符串。

在字符串前面加r表示表示非转义的原始字符串

> a='a\nb'
> print(a)
a
b
> a=r'a\nb'
> print(a)
a\nb