1、字符编号:
字符串是一种数据类型,它有一个编码的问题
字符编码的历史:
(1)计算机只处理数字,所以要处理文本必须将它转化为数字才能处理。8bit(比特)=1byte(字节),1byte能表示的最大整数为255=二进制11111111。2bytes=65535=二进制16个1;
(2)最早美国人发明计算机的时候,只有127个字符被编到计算机中表示英文大小写字母、数字和一些符号,这个编码被称为ASCII编码,1byte表示。如A的编码为65,z的编码为122;
(3)要处理中文,1byte不够,至少需要2bytes,还不能和ASCII码冲突,中国制定了GB2312编码,各国也制定了自己的标准,这样多种语言混一起就会有乱码;
(4)Unicode把所有语言统一到一套编码中,解决了多种语言在一起乱码的问题,通常是2bytes,也有4bytes;
(5)出问题了,如果是纯英文用Unicode编码会浪费一半的空间。本着节约的精神 ,UTF-8(可变长编码)出现,UTF-8把一个个Unicode字符根据不同的数字大小编码成1-6个字节,英文1个字节,汉字通常是3个字节,生僻字为4-6个字节。
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
python中字符串编码:
在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言
ord()和chr()函数
由于Python的字符串类型是str
,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str
变为以字节为单位的bytes
。
Python对bytes
类型的数据用带b
前缀的单引号或双引号表示:
encode():
纯英文的str
可以用ASCII
编码为bytes
,内容是一样的,含有中文的str
可以用UTF-8
编码为bytes
。含有中文的str
无法用ASCII
编码,因为中文编码的范围超过了ASCII
编码的范围,Python会报错。
在bytes
中,无法显示为ASCII字符的字节,用\x##
显示。
decode():
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes
。要把bytes
变为str
,就需要用decode()
方法:
如果bytes
中只有一小部分无效的字节,可以传入errors='ignore'
忽略错误的字节:
len()函数:
计算 字符数:
计算字节数:
1个中文字符经过UTF-8编码后通常会占用3个字节(中文两个字符占6个字节,6/2=3),而1个英文字符只占用1个字节(ABC三个字符占3个字节3/3=1)。
格式化:%
%
运算符就是用来格式化字符串的。在字符串内部,%s
表示用字符串替换,%d
表示用整数替换,有几个%?
占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?
,括号可以省略。
占位符 | 替换内容 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
另一种格式化字符串的方法是使用字符串的format()
方法,它会用传入的参数依次替换字符串内的占位符{0}
、{1}
……,不过这种方式写起来比%要麻烦得多: