Unicode表 § 编码和解码

454 阅读2分钟

ASCII表

ASCII码对照表建立了0000,0000到0111,1111共128个数字到字符的对应关系,如下图所示

Unicode表

但是128个数字显然无法涵盖所有的字符,于是为了照顾全世界上百万个字符,Unicode表就诞生了。Unicode为每个字符唯一分配了一个数字编号,编号范围从0x00一直到0x10ffff 在这里字符'A'对应的Unicode编号就是0x0041 在这里字符'遛'对应的Unicode编号就是0x905B

utf-8

Unicode只是规定了字符到编号的一一对应关系,并没有规定如何的存储这个编号,于是就有了utf-8,utf-16这些编码方式,这里只研究utf-8编码。utf-8是用可变数量的字节存储编号,也就是编号小的用的字节就少,编号大的用的字节就大。具体的编码规则为:

  1. 对于单字节的符号,字节的第一位设为0,后面的7位为这个符号的Unicode码
  2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,然后将这个符号的Unicode码填入剩下的没有提及的二进制位中,如果还有位置没有填,一律填0

上图就是把Unicode编号0x9A6C用utf-8编码表示

u r b

u表示后面的字符串是unicode编码,python3中所有的字符串都是unicode字符串
r表示后面的字符串不需要任何的转义
b表示后面的字符串是bytes类型,即b'abc'表示\x61\x62\x63

b前缀只允许 b'abc'和b'\x61\x62\x63'两种形式

bytes和bytearray

bytes: 不可变的字节序列     b'abc'
bytearray: 可变的字节序列   bytearray(b'abc')

编码和解码

将其他编码的字符串decode成unicode字符串,再从unicode字符串encode成另一种编码
xxx ---decode---> unicode ---encode---> yyy

\u和\x

\u之后跟4位十六进制数,取值范围从\u0000到\uFFFF
\x之后跟2位十六进制数,取值范围从\x00到\xFF

\x5F 等于 \u005F