徹底解決Python編碼問題
阿新 • • 發佈:2020-04-26
## 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 o