我下面记录的很多是从参考那里来的,但是好像写转载只能填一个链接,所以我就写原创了。但其实主要是想给自己看的个人笔记。
咳咳,这个必须了解。
简单地说呢,就是字符串是一个对象,它可以使用encode()
方法转化成指定编码方式的 bytes 对象。比如 UTF-8 编码方式、GBK编码方式、gb2312编码方式。
而一个 bytes 对象,可以使用decode()
方法,以及正确的编码方式,来转化成有意义的字符串。
如下图(来源自参考链接2):
下面是例程(同样来源于参考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对象 → \rightarrow → Unicode编码的字符串 → \rightarrow → utf-8方式编码的bytes对象
那就是,Unicode 作为中转的符号集,一定是和其他编码都有对应的!也就是说,一个汉字在python3中用Unicode表示后,python内置的函数知道这个Unicode码对应了不同编码方式中的哪个二进制值。= =嗯,这果然是大工程。
我不知道是不是对的。
参考: