python中编码问题

时间:2022-05-20 15:41:00

各种编码在内存中所占的大小:

ascii:    英文:8bit (1B)

uft-:    英文:8bit (1B)
中文:24bit (3B) GBK: 英文:8bit (1B)
中文:16bit (2B) unicode: 英文:32bit (4B)
中文:32bit (4B)

python3代码执行过程:

  1. 解释器找到代码文件(文件以utf8/GBK..存储),
  2. 把代码字符串按文件头定义的编码进行解码到内存,转成unicode
  3. 所有的变量字符都会以unicode编码声明(str的编码方式就是unicode)

unicode只在内存中进行显示, 传输和存储需要用到utf8/GBK.., 所以必须转成utf8/GBK..

str和bytes的区别就是编码方式的不同:

 str(unicode编码)      ==>     bytes(utf8/GBK..)       ==>         存储, 传输
bytes = str.encode('utf-8') # 编码
str = bytes.decode('utf-8') # 解码

python3中str和bytes表现和编码:

 英文:
str: 表现方式==>'a'
编码方式==>0101 unicode bytes: 表现方式==>b'a'
编码方式==>0101 utf8/GBK.. 中文:
str: 表现方式==>'中'
编码方式==>0101 unicode bytes: 表现方式==>b'x\e9'
编码方式==>0101 utf8/GBK..

在python2中:

  1. u'xxx'为unicode对象, 就是python3中的str
  2. bytes和str是同一个类型
 s = 'a'
print (s, type(s)) # 'a', <type 'str'> s = u'中文'
print(s, type(s)) # u'\u4e2d\u6587', <type 'unicode'>
# 编码变成utf-8, 一个中文三个字节
s1 = s.encode('utf-8')
print(s1, type(s1)) # '\xe4\xb8\xad\xe6\x96\x87', <type 'str'> # bytes和str是同一个类型
s1 = 'a'
s2 = bytes('a')
print(s1 is s2) # True