- 字符串是一种基本数据类型,不同的是,它还存在编码问题
- 我们知道,一个字节(byte)有8(个比特)位(bit),那么,它所能表示的范围是有限的。ASCII编码表一共有127个字符,比如
0
的编码是48,A
的编码是65,a
的编码是97。世界上有上百种语言,各国有各国的标准,如中国制定了GB2312
编码,用来编进中文。为了不发生混乱,Unicode
字符应运而生,它把所有的语言编写到了一套编码里,这样就不会有乱码问题了。 - 新的问题又出现了:如果统一成
Unicode
编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode
编码比ASCII
编码需要多一倍的存储空间,在存储和传输上就十分不划算。 - 所以,本着节约的精神,又出现了把
Unicode
编码转化为“可变长编码”的UTF-8
编码。UTF-8
编码把一个Unicode
字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8
编码就能节省空间
编码
- 由于Python的字符串类型是str,在内存中以
Unicode
表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。Python对bytes类型的数据用带b前缀的单引号或双引号表示:
x = b'abc'
- 以
Unicode
表示的str通过encode()方法可以编码为指定的bytes,例如:
'abc'.encode('ASCII')
'中文'.encode('UTF-8')
解码
- 反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
b'abc'.decode('SCCII')
b'\xe4\xb8\xad\xe6\x96\x87'.decode('UTF-8')
字符 编码
- 对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
ord('A')
ord('中')
char(66)
char(25991)