1. 程式人生 > >Python2與Python3的字元編碼與解碼

Python2與Python3的字元編碼與解碼

轉載於:https://www.jianshu.com/p/19c74e76ee0a

編碼與解碼

編碼(encode):在Unicode中,每一個字元都有一個唯一的數字表示,那麼將Unicode字串轉換為特定字元編碼(ASCII、UTF-8、GBK)對應的位元組串的過程和規則就是編碼。

解碼(decode):將特定字元編碼(ASCII、UTF-8、GBK)的位元組串轉換為對應的Unicode字串的過程和規則就是解碼。

簡單理解:編碼是給計算機底層用的,解碼是顯示給人看的。

3 Python中的預設編碼

3.1 Python原始碼檔案的執行過程

我們都知道,磁碟上的檔案都是以二進位制格式存放的,其中文字檔案都是以某種特定編碼的位元組形式存放的。對於程式原始碼檔案的字元編碼是由編輯器指定的,比如我們使用Pycharm來編寫Python程式時會指定工程編碼和檔案編碼為UTF-8,那麼Python程式碼被儲存到磁碟時就會被轉換為UTF-8編碼對應的位元組(encode過程)後寫入磁碟。

當執行Python程式碼檔案中的程式碼時,Python直譯器在讀取Python程式碼檔案中的位元組串之後,需要將其轉換為Unicode字串(decode過程)之後才執行後續操作。


3.2 預設編碼

如果我們沒有在程式碼檔案指定字元編碼,Python直譯器會使用哪種字元編碼把從程式碼檔案中讀取到的位元組轉換為Unicode字串呢?就像我們配置某些軟體時,有很多預設選項一樣,需要在Python直譯器內部設定預設的字元編碼來解決這個問題,這就是“預設編碼”。

Python2和Python3的直譯器使用的預設編碼是不一樣的,我們可以通過sys.getdefaultencoding()來獲取預設編碼:

>>> # Python2
>>> import sys
>>> sys.getdefaultencoding()
'ascii'

 >>> # Python3
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

對於Python2來講,Python直譯器在讀取到中文字元的位元組碼時,會先檢視當前程式碼檔案頭部是否指明字元編碼是什麼。如果沒有指定,則使用預設字元編碼"ASCII"進行解碼,導致中文字元解碼失敗,出現如下錯誤:

SyntaxError:Non-ASCII character '\xc4' in file xxx.py on line 11, but no encoding declared;
see http://python.org/dev/peps/pep-0263/ for details

對於Python3來講,執行過程是一樣的,只是Python3的直譯器以"UTF-8"作為預設編碼,但是這並不表示可以完全相容中文問題。比如我們在Windows上進行開發時,Python工程及程式碼檔案都使用的是預設的GBK編碼,也就是說Python程式碼檔案是被轉換成GBK格式的位元組碼儲存到磁碟中的。Python3的直譯器執行該程式碼檔案時,試圖用UTF-8進行解碼操作時,同樣會解碼失敗,出現如下錯誤:

SyntaxError:Non-UTF-8 code starting with '\xc4' in file xx.py on line 11, but no encodingdeclared; 
see http://python.org/dev/peps/pep-0263/ for details



作者:hufengreborn
連結:https://www.jianshu.com/p/19c74e76ee0a
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。