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>",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>",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编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

 

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...