我下面记录的很多是从参考那里来的,但是好像写转载只能填一个链接,所以我就写原创了。但其实主要是想给自己看的个人笔记。

咳咳,这个必须了解。

简单地说呢,就是字符串是一个对象,它可以使用encode()方法转化成指定编码方式的 bytes 对象。比如 UTF-8 编码方式、GBK编码方式、gb2312编码方式。

而一个 bytes 对象,可以使用decode()方法,以及正确的编码方式,来转化成有意义的字符串。

如下图(来源自参考链接2):

encode函数 python python3 encode函数_ico


下面是例程(同样来源于参考2):

>>> '€20'.encode('utf-8')
b'\xe2\x82\xac20'
>>> b'\xe2\x82\xac20'.decode('utf-8')
'€20'

python3的字符串总是用 Unicode 表示,所以我有一个疑问:encode()是怎么把 Unicode 转化成不同编码方式的 bytes对象(也就是字节)的呢?

这里要注意,Unicode 是字符集,规定了每个字符的二进制代码,但是没有规定 这些代码怎么存储。实现存储的方式常见的有 utf-8 编码方式。

但是,Unicode 是怎么转变成 GBK 或者 gb2312 编码的字节流的呢?毕竟它们都不是Unicode的实现方式,而是完全独立的编码规则。对于同一个中文字符,表示的数值都可能是不一样的吧?

但是上述疑问在我找到参考6和7后,就有点想法了,但仅仅是想法,还没有去看python3文档= =:

GBK方式编码的bytes对象 encode函数 python python3 encode函数_python_02 Unicode编码的字符串 encode函数 python python3 encode函数_python_02 utf-8方式编码的bytes对象

那就是,Unicode 作为中转的符号集,一定是和其他编码都有对应的!也就是说,一个汉字在python3中用Unicode表示后,python内置的函数知道这个Unicode码对应了不同编码方式中的哪个二进制值。= =嗯,这果然是大工程。

我不知道是不是对的。

参考:

  1. Python 3的bytes/str之别 codecs模块
  2. The bytes/str dichotomy in Python 3
  3. Python3中的bytes和str类型详解
  4. 计算机字符编码详解——从理论到实践
  5. 字符编码和python使用encode,decode转换utf-8, gbk, gb2312
  6. python模块之codecs: 自然语言编码转换
  7. python编码问题之encode、decode、codecs模块