彻底解决Python编码问题
oaksharks 人气:3
## 1. 基本概念
- 字符集(Character set)
- 解释:文字和符合的总称
- 常见字符集:
- Unicode字符集
- ASCII字符集(Unicode子集)
- GB2312字符集
- 编码方法(Encoding)
- 解释:将字符对应到字节的方法,部分字符集和编码方法名称一样。
- 常见编码方法:
- UTF-8:可对Unicode字符进行编码
- GB2312
- ASCII
- 编码(Encode)
- 解释:将字符集中字符按照一定规则转换成字节
- 解码(Decode)
- 解释:与编码相反,将字节转换为字符集中的字符
- 字符集与编码方法的关系
- 每个字符集都有对应的编码方法
- 一种字符集可能有多种编码方法
- 不同的编码方法得到的字节不同,占用存储空间也不一样
- 例如Unicode字符可以使用UTF-8/ASCII/GBK等方法编码
- Unicode字符集包含世界上大部分字符,很多其他字符集有的字符它都有,是他们的超集
- 大部分字符集可以理解为Unicode的子集
- 实际上,除了Unicode之外所谓的字符集主要是对Unicode部分字符编码而已(定义编码方式)
- 一种编码不必支持Unicode的所有字符(通常把它能支持的那部分称为它的字符集)
## 2. 关于编码的错误和解决方法
在开发过程中,我们所接触的字符集大多都是Unicode,大部分报错都是关于编码和解码的。
### 2.1. 编码错误UnicodeEncodeError
#### 2.1.1. 错误分析
导致该错误的原因通常是编码方法支持的Unicode字符不全;在工作中,你写了一个txt中文文档,想用ascii编码去保存这个文件,就会报这种错误。
**错误复现:**
我们知道`ascii`不支持字符`中`,那我们用`ascii`编码方法对`Unicode`码`中`进行编码:
```python
# -*- encoding: utf-8 -*-
u"中".encode(encoding='ascii')
```
报错如下:
```
UnicodeEncodeError: 'ascii' codec can't encode character '\u4e2d' in position 0: ordinal not in range(128)
```
这是一个`UnicodeEncodeError` 类型的错误,提示无法使用指定的编码方法对字符进行编码,报错提示中可以得到3个信息:
- 当前使用的是acsii编码方法
- 被编码的字符是'\u4e2d'
- ascii编码方法能支持的字符有128个
有时候我们还可以利用这个提示查看编码方法支持的字符个数:
```python
# -*- encoding: utf-8 -*-
u"中".encode(encoding='iso-8859-1')
```
报错:
```
UnicodeEncodeError: 'latin-1' codec can't encode character '\u4e2d' in position 0: ordinal not in range(256)
```
通过报错提示可以看出`iso-8859-1`能编256个字符。
接着,我们来看下用支持中文的`utf-8` 编码方法进行编码能得到什么结果:
```python
# -*- encoding: utf-8 -*-
s = u"中".encode(encoding='utf-8')
print("s: ", s)
print("s == 中?" , s == '中')
print("type of s: ", type(s))
print("str==bytes? ", bytes == type(s))
```
输出:
```
('s: ', '\xe4\xb8\xad')
('s == \xe4\xb8\xad?', True)
('type of s: ',
加载全部内容