1. 程式人生 > >徹底解決Python編碼問題

徹底解決Python編碼問題

## 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