python2.7.x 以Unicode表示的str用u'...'表示---(没有u,中文是乱码)
python3.x.x 默认以Unicode表示str (可以加u)
Unicode表示的str转化成utf-8格式
python2.7.x u'ABC'.encode('utf-8')
python3.x.x 'ABC'.encode('utf-8')
英文字符转换后表示的UTF-8的值和Unicode值相等(但占用的存储空间不同)
而中文字符转换后1个Unicode字符将变为3个UTF-8字符
把UTF-8编码表示的字符串'xxx'转换为Unicode字符串 'xxx'.decode('utf-8')
脚本中
#!/usr/bin/env python
# -*- coding: utf-8 -*-
并且中文字符串必须是Unicode格式
字符与字节的转换
1.由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。
2.如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
3.Python对bytes类型的数据用带b前缀的单引号或双引号表示
例子: x=b'ABC'
要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。
含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。
在bytes中,无法显示为ASCII字符的字节,用\x##显示。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。
要把bytes变为str,就需要用decode()方法:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数:
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))---------------python3
6
特别注意:
>>>len('中文')--------------------------python3
2
>>>len(u'中文')-------------------------python2
2
>>>len('中文')-------------------------python2
6