python 中的编码问题
很多时候,我们在写 python 代码时,会被各种编码格式搞得焦头烂额,譬如最常见的 unicode
、ASCII
、utf-8
、gb2312
以及各类不同的 iso-xxxx
。
下面,我们来了解一下他们之间的关系以及在 python 中如何正确的进行转换。
- 为什么会有各类编码?
- unicode 与 utf-8 之间的关系?
- python 中如何正确使用?
为什么会有各类编码
-
ASCII
:用来完成拉丁字母、各类数字以及常见符号的编码。但是这类编码无法完成汉字类的编码,原因是ASCII
只有 8 位,也就是只能表示 255 个不同字符。但是汉字个数远超 255,所以需要定义新的编码格式。 -
gb2312
:国标码,用来完成汉字编码,并且将ASCII
囊括进去。但是不同国家有不同的编码,造成传输困难。 -
unicode
:统一编码格式,采用了 16 位来表示。但是缺点是需要很大的存储空间和传输带宽,算是牺牲了有效性换取了可靠性。 -
utf-8
:unicode
的进化版,变长码,针对英文采用 1 字节,针对汉字采用 3 字节。缺点是在内存中不好进行处理。
unicode
和 utf-8
之间的关系
二者之间的区别参见下面的表格:
unicode | utf-8 |
---|---|
码字定长,16位 | 变长码,针对英文和非英文不同 |
用于读取操作 | 用于写入操作 |
在 python 中可以使用 encode
和 decode
进行两者之间的转换。
python 中如何正确使用
在 python2 和 python3 中,编码格式是不同的。
具体可以使用如下指令查看:
import sys
sys.getdefaultencoding()
在 python3 中统一使用 utf-8
编码,因此不需要考虑中文转换的问题。
而在 python2 中,情况比较复杂。在 windows 下编码格式为 gb2312
,而在 linux 下为 unicode
。
下面,来结合代码具体谈一下 encode
和 decode
的用法。
python2 + windows 下:
## python2.x
# -*- coding: utf-8 -*-
## 用于 python 解释器识别中文
s = "我学python" # 非 unicode 编码
su = u"我学python" # unicode 编码
s.encode("utf8")
# 报错。
# 第一个知识点:因为字符串 s 不是 unicode 格式,无法使用 utf-8 编码
# 也就是说,只有 unicode 才能使用 utf-8 进行 decode
s.decode("gb2312").encode("utf8")
# 正确。
# 首先使用 gb2312 解码为 unicode,再使用 utf8 编码
su.encode("tuf8")
# 正确
# su 为 unicode,所以可以使用 utf-8 编码
python3 + windows 下:
默认为 utf-8 编码,因此可以直接使用 encode("utf8")
。