16進制、編碼問題

16進制:html

# 十進制轉換成8進制: 
oct ( 數字)
# 十進制轉換成16進制:  
hex( 數字)

進制轉換:https://blog.csdn.net/u012063703/article/details/42609833編程

 

CPU、內存、硬盤咱們看到都是採用的16進制計算。編程語言

一個字節(byte)可以用2個16進制的數來表示。4個2進制對應1個16進制。編碼

 

編碼:spa

全部的系統、編程語言都默認支持Unicode。操作系統

編碼和解碼:.net

# 解碼: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的格式輸出,這個時候顯示結果就會出現亂碼。code

如下程序在Python2上運行:htm

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終端中顯示會出現亂碼

總結:blog

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

相關文章
相關標籤/搜索