Python 編碼
ASCII、Unicode、UTF-8 以及 gbk
在具體說明 Python 編碼之前,先來理清 ASCII、Unicode、UTF-8、gbk 究竟是什么? 這邊僅簡單介紹下,具體請百度。
ASCII:是現今最通用的單字節編碼系統。ASCII(僅1~127) 僅可代表英文、數字及一些符號等,如,A 的 ASCII 碼為65(十進制)。
Unicode:為了解決傳統的字符編碼方案的局限而產生,為每種語言中的每個字符設定了統一並且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。猶如其本身的英文含義,Unicode是一種所有符號的編碼。Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。
UTF-8:是一種針對Unicode的可變長度字符編碼,它是Unicode實現的方式之一,是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間,參考如下:
gbk:GBK是國家標准GB2312基礎上擴容后兼容GB2312的標准。GBK的文字編碼是用雙字節來表示的,即不論中、英文字符均使用雙字節來表示,為了區分中文,將其最高位都設定成1。GBK包含全部中文字符,是國家編碼。
Python3 支持 Unicode
從 Python 3.0 開始所有的字符串都支持 Unicode,默認保存為UTF-8格式;故無須特殊處理,即可正常 print 中文
但 Python3 無 sys.setdefaultencoding()這個函數,故原 Python2 的擴展包要適應這種情況來改寫。
Python2 處理 Unicode
Python2 默認源代碼文件是 ASCII 編碼,故僅僅使用英文、數字的情況下一切正常,但是若使用了中文等,會報錯,如下:
為了解決此問題,需要保存為 UTF-8 格式,通常會在 .py 文件頭上加上 # -*- coding: utf-8 -*- ,這樣,python就會依照utf-8的編碼形式解讀其中的字符,加上后運行,如下:
這邊,直接 print 中文字符串顯示為亂碼,這是由於python編碼與控制台編碼的不一致造成的。Windows下控制台中的編碼使用的是gbk,而在代碼中使用的utf-8,python按照utf-8編碼打印到gbk編碼的控制台下自然就會不一致而不能打印出正確的漢字。
對此,Python2用來存儲文本數據的類型為Unicode 對象,它可以用於存儲和維護 Unicode 數據,與現有的字符串對象有良好的集成,必要時提供自動轉換。在 Python 中創建 Unicode 字符串和創建普通的字符串一樣簡單,只需在字符串引號前加 u 即可,如上例中的 u"中文" 。這樣處理之后,print 出的中文就不會亂碼了。
在Python 3.x版本中,把'xxx'和u'xxx'統一成Unicode編碼,即寫不寫前綴u都是一樣的
sys.setdefaultencoding()
Python2,可通過 sys.setdefaultencoding('utf8') 來設置默認encoding方式,注意,一定要增加 reload(sys),原因參考下方引用。
1 #!/usr/bin/env python 2 #encoding: utf-8 3 import sys #引用sys模塊進來,並不是進行sys的第一次加載 4 reload(sys) #重新加載sys 5 sys.setdefaultencoding('utf8') #調用setdefaultencoding函數
那么為什么要重新加載,而直接引用過來則不能調用該函數呢?因為setdefaultencoding函數在被系統調用后被刪除了,所以通過 import引用進來時其實已經沒有了,所以必須reload一次sys模塊,這樣setdefaultencoding才會為可用,才能在代碼里修改解釋器當前的字符編碼。
在python安裝目錄的Lib文件夾下,有一個叫site.py的文件,在里面可以找到main() --> setencoding()-->sys.setdefaultencoding(encoding),因為這個site.py每次啟動 python解釋器時會自動加載,所以main函數每次都會被執行,setdefaultencoding函數一出來就已經被刪除了。