由以上内容的思考:
python中字符串的默认编码是Unicode编码,但是在实际运用中市场需要Unicode和UTF-8(包含了ASCII)之间的转换。
ASCII编码:一个字符由1个byte(8位二进制/8bits)表示;
Unicode编码:一个字符由2个byte表示;
UTF-8编码:一个字符由1个或者多个byte表示,“可变长编码”,向下覆盖了ASCII编码。
编码格式就是一张带角标的字符表,区别是角标的表示位数。
如果知道字符的整数编码(默认都是Unicode编码),还可以用十六进制这么写str
:
#\u表示Unicode编码,4e2d和6587位16进制数,2位表示一个byte,Unicode有4位表示2个字节
>>> '\u4e2d\u6587'
'中文'
但是要传输和存储动作时,需要将Unicode码转化为字节码bytes数据类型,这一数据类型就是按照ASCII和UTF-8编码的,在纯英文和数字及普通字符时就是ASCII编码格式。
其实保存到磁盘时所以一般都选UTF-8编码格式,是指在保存和读取时使用该格式编码和解码,我们写的python代码直接使用Unicode(编辑的时候实际上都存储在内存中)。
eg:记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
bytes数据类型有固定表示:b
x = b'ABC'
对于理解这里需要知道,使用byte数据类型就是读取或者写入一个一个字节,计算机就是这么干的。
编码:
>>> '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)
解码:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。
在操作字符串时,我们经常遇到str
和bytes
的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str
和bytes
进行转换。
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上:
# -*- coding: utf-8 -*-