16進制、編碼問題


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM