python里面encode & decode相关知识

1.str & bytes的对应关系

1.字符表示的是文本中的单个符号,是文本的最小单位,例如,“中”,“w”,"$",都是不同的字符,但这些字符可以根据不同的编码方式,使用不同的字节去表示。
2.一个字符不是一个字节。我再强调一遍!一个字符不是一个字节!!!而且,一个字符有许多表示方法(不同的编码方式,如utf8,gb2312,GBK等),不同的表示方法会使用不同的字节数。字节,是不同编码方式里面的最小单位。
3.详情可阅读:https://blog.****.net/wkdami/article/details/78982000

(1)转换关系图

python里面encode & decode相关知识

(2)转换案例

  • 案例一
a = '我爱你中国'
print(type(a))

# 通过encode, str----->bytes
b = a.encode(encoding="gbk")
print(type(b))

# 再通过decode,bytes----->str
c = b.decode(encoding="gb2312")
print(type(c))

结果:

<class 'str'>
<class 'bytes'>
<class 'str'>
  • 案例二
a = '我爱你中国'
print(type(a))

b = a.encode(encoding="gbk")     # b = bytes(a, encoding="gbk"),效果一致
print(b, type(b))

c = a.encode(encoding="gb2312")
print(c, type(c))

d = a.encode(encoding="utf8")
print(d, type(d))

结果:

<class 'str'>
b'\xce\xd2\xb0\xae\xc4\xe3\xd6\xd0\xb9\xfa' <class 'bytes'>
b'\xce\xd2\xb0\xae\xc4\xe3\xd6\xd0\xb9\xfa' <class 'bytes'>
b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>
  • 案例三
import codecs

a = "我爱你中国"

# 创建gb2312编码器
look = codecs.lookup("gb2312")
b = look.encode(a)

print(b)
print(type(b))

结果:

(b'\xce\xd2\xb0\xae\xc4\xe3\xd6\xd0\xb9\xfa', 5)
<class 'tuple'>

2.python3 & python2 默认的编码格式

python3 默认使用utf-8编码,python2 默认使用ascii编码

import sys
print(sys.getdefaultencoding())

结果:

utf-8

3.不同编码之间的转换

unicode为桥梁,utf-8和gbk互转需要经过unicode这个翻译,不然他们二者是无法直接沟通。

Python2的默认编码是ASCII码,当后来大家对支持汉字、日文、法语等语言的呼声越来越高时,Python于是准备引入unicode,但若直接把
默认编码改成unicode的话是不现实的, 因为很多软件就是基于之前的默认编码ASCII开发的,编码一换,那些软件的编码就都乱了。所以Python 2
就直接搞了一个新的字符类型,就叫unicode类型,比如你想让你的中文在全球所有电脑上正常显示,在内存里就得把字符串存成unicode类型。

Python3 除了把字符串的编码改成了unicode, 还把str 和bytes 做了明确区分, str 就是unicode格式的字符, bytes就是单纯二进制啦。
在py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。

python3

  • 文件默认编码是utf-8 , 字符串编码是 unicode
  • 以utf-8 或者 gbk等编码的代码,加载到内存,会自动转为unicode正常显示。

python2

  • 文件默认编码是ascii , 字符串编码也是 ascii , 如果文件头声明了是gbk,那字符串编码就是gbk。
  • 以utf-8 或者 gbk等编码的代码,加载到内存,并不会转为unicode,编码仍然是utf-8或者gbk等编码。

详情可参考文档:https://www.cnblogs.com/schut/p/8407258.html
https://www.cnblogs.com/hester/p/5465338.html

str 与 bytes 之间通过 decode() 和encode()相互转换;但是,不同编码的bytes()字节,需要使用unicode编码格式作为中间编码,最终转换为你需要的编码格式

python里面encode & decode相关知识
python里面encode & decode相关知识

  • 错误案例一(使用utf-8编码的bytes无法使用gbk去解码):
a = '我爱你中国'
print(type(a))

# str------>bytes(utf-8)
b_utf8 = a.encode("utf-8")
print(b_utf8)

# bytes(utf-8)------>str(gbk)  无法实现
c_unicode = b_utf8.decode("gbk")
print(c_unicode)

结果:

<class 'str'>
b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\xe4\xb8\xad\xe5\x9b\xbd'

Traceback (most recent call last):
  File "D:/MyProjects/ReportStudy/str_bytes.py", line 24, in <module>
    c_unicode = b_utf8.decode("gbk")
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbd in position 14: incomplete multibyte sequence
  • 正确案例一(使用gbk编码的bytes只能使用gbk去解码):
a = '我爱你中国'
print(type(a))

# str------>bytes(gbk)
b_utf8 = a.encode("gbk")
print(b_utf8)

d_unicode = b_utf8.decode("gbk")
print(d_unicode)

结果:

<class 'str'>
b'\xce\xd2\xb0\xae\xc4\xe3\xd6\xd0\xb9\xfa'
我爱你中国