16進制:
# 十進制轉換成8進制: oct ( 數字) # 十進制轉換成16進制: hex( 數字)
進制轉換:https://blog.csdn.net/u012063703/article/details/42609833
CPU、內存、硬盤我們看到都是采用的16進制計算。
一個字節(byte)能夠用2個16進制的數來表示。4個2進制對應1個16進制。
編碼:
所有的系統、編程語言都默認支持Unicode。
編碼和解碼:
# 解碼:decode() UTF-8/GBK... --> decode 解碼 --> Unicode # 編碼:encode() Unicode --> encode 編碼 --> GBK / UTF-8 ..
假設某Python文件是以UTF-8保存的,現在Python2上運行,解釋器讀取該文件: 先從硬盤上按照聲明的UTF-8格式讀取到內存里, 但此時,Python2不會將讀取的UTF-8格式的文本自動轉換成Unicode的格式,也就是說解釋器把該文件讀取到內存時 該文件還是UTF-8的格式, 此時你在Windows上打印,由於Windows中文版默認的終端是GBK,而打印的結果是以UTF-8的格式輸出,這個時候顯示結果就會出現亂碼。
以下程序在Python2上運行:
s = '哈哈哈' print s # 這個輸出結果會出現亂碼,原因如上所說 s1 = s.decode('utf-8') # 對 s進行解碼(就是解碼成Unicode),括號內要寫明對哪種格式的編碼進行解碼(如本例中的對UTF-8解碼) print s1 # 這個打印結果就不會出現亂碼, 因為經過解碼s1已經變成了Unicode的格式, 而Unicode和GBK又有一個映射關系、能夠互相兼容,所以顯示結果不會出現亂碼 print type(s1) #利用這種方法能顯示出s1的格式是Unicode s2 = s1.encode(‘GBK’) #對s1再進行編碼(就是把Unicode轉換成其他類型的編碼。例如本句中的轉換成GBK),把s1轉換成GBK格式並賦值給s2(括號內要寫明編碼成的格式,例如本句中的GBK) print s2 #這個打印結果不會出現亂碼, 因為s2是GBK格式的,而系統默認的也是GBK, 所以能正常顯示出來。 s3 = s1.encode(‘utf-8’) # 對s1進行編碼,再把s1轉換成utf-8的格式並賦值給s3 print s3 # 這個打印結果也會出現亂碼, 因為s3也是utf-8格式的,在系統默認的GBK終端中顯示會出現亂碼
總結:
Python3中: 文件的默認編碼是utf-8, 讀取到內存里的字符串的編碼是:Unicode (Python3讀取到內存時都會自動轉成Unicode) Python2中: 文件默認編碼是:ASCII 讀取到內存里的字符串的編碼: 默認是ASCII,但是,如果文件頭聲明了何種編碼,那讀取到內存里的字符串就是該種編碼(如: 假如文件開頭聲明了是GBK,那讀取到內存的字符串就是GBK格式)。 在Python2里面, Unicode是一個 單獨類型。
轉編碼是不可逆的。轉編碼的過程中要是出現亂碼就得重新寫,所以,不要轉編碼。
終端(terminal)是繼承操作系統的編碼
Python bytes類型:
# Python2: Python2中的字符串其實更應該稱為字節串; 在Python2中, bytes == str 另外, Python2中還有個單獨的類型是Unicode,把字符串解碼后就會變成Unicode # Python3: PY3除了把字符串的編碼改成了Unicode,還把str和bytes做了明確的區分: str就是Unicode格式的字符,bytes是單純的二進制
最后再提示一下,Python只要出現各種編碼問題,無非是哪里的編碼設置出錯了
常見編碼錯誤的原因有:
- Python解釋器的默認編碼
- Python源文件文件編碼
- Terminal使用的編碼
- 操作系統的語言設置
編碼問題參考這篇文章: http://www.cnblogs.com/alex3714/articles/7550940.html