基于scrapy的分布式爬虫(4):python 中的编码问题

时间:2021-12-29 22:56:04

python 中的编码问题

很多时候,我们在写 python 代码时,会被各种编码格式搞得焦头烂额,譬如最常见的 unicodeASCIIutf-8gb2312 以及各类不同的 iso-xxxx

下面,我们来了解一下他们之间的关系以及在 python 中如何正确的进行转换。

  • 为什么会有各类编码?
  • unicode 与 utf-8 之间的关系?
  • python 中如何正确使用?

为什么会有各类编码

  1. ASCII:用来完成拉丁字母、各类数字以及常见符号的编码。但是这类编码无法完成汉字类的编码,原因是 ASCII 只有 8 位,也就是只能表示 255 个不同字符。但是汉字个数远超 255,所以需要定义新的编码格式。
  2. gb2312:国标码,用来完成汉字编码,并且将 ASCII 囊括进去。但是不同国家有不同的编码,造成传输困难。
  3. unicode:统一编码格式,采用了 16 位来表示。但是缺点是需要很大的存储空间和传输带宽,算是牺牲了有效性换取了可靠性。
  4. utf-8unicode的进化版,变长码,针对英文采用 1 字节,针对汉字采用 3 字节。缺点是在内存中不好进行处理。

unicodeutf-8 之间的关系

二者之间的区别参见下面的表格:

unicode utf-8
码字定长,16位 变长码,针对英文和非英文不同
用于读取操作 用于写入操作

在 python 中可以使用 encodedecode 进行两者之间的转换。

python 中如何正确使用

在 python2 和 python3 中,编码格式是不同的。

具体可以使用如下指令查看:

import sys
sys.getdefaultencoding()

在 python3 中统一使用 utf-8 编码,因此不需要考虑中文转换的问题。

而在 python2 中,情况比较复杂。在 windows 下编码格式为 gb2312,而在 linux 下为 unicode

下面,来结合代码具体谈一下 encodedecode 的用法。

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")