20200917-Python学习笔记3
编码
ASCII编码一个字节
Unicode编码通常两个字节
字母A用ASCII编码是十进制的65,二进制的01000001
字符0用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的
汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101
UTF-8编码是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部份修改后,便可继续使用。
ord()函数获取字符的整数表示
chr()函数把编码转换为对应的字符
>>> ord('u') 117 >>> ord('U') 85 >>> ord('we') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: ord() expected a character, but string of length 2 found >>> chr(89) 'Y' >>> chr(85) 'U' >>>
Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes
Python对bytes类型的数据用带b前缀的单引号或双引号表示
'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节
以Unicode表示的str通过encode()方法可以编码为指定的bytes
例子:
>>> 'we'.encode('ascii') b'we' >>> b'we' b'we' >>> '汉字'.encode('utf-8') b'\xe6\xb1\x89\xe5\xad\x97' >>> 'we'.encode('utf-8') b'we' >>> '汉字'.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) >>>
在bytes中,无法显示为ASCII字符的字节,用 \x## 显示。反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。
把bytes变成str,要用到decode()方法
>>> b'ASD' b'ASD' >>> b'ASD'.decode('ascii') 'ASD' >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') '中文'
如果bytes中包含无法解码的字节,decode() 方法会报错,如果字节只有一小部分,可以传入errors='ignore' 忽略错误的字节
>>> b'\xe4\xb8\xad\xff'.decode('utf-8',errors='ignore') '中' >>> b'\xe4\xb8\xad\xff'.decode('utf-8') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte >>>
len()函数可以计算str包含多少个字符
>>> len('BIG') 3 >>> len('今晚打老虎') 5 >>>
len()函数:返回项目(字符、字节、列表)的长度或个数
len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数。
>>> len('iop') 3 >>> len('aaa') 3 >>> len(b'\xe4\xb8\xad\xe6\x96\x87') 6 >>> len('中文'.encode('utf-8')) 6 >>>
当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3 # -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。