十六進制,0123456789ABCDEF 二進制到16進制轉換html
http://jingyan.baidu.com/album/47a29f24292608c0142399cb.html?picindex=1
因爲Python的字符串類型是str,在內存中以Unicode表示,一個字符對應若干個字節。若是要在網絡上傳輸,或者保存到磁盤上,就須要把str變爲以字節爲單位的bytes。python
python3都是以2進制bytes傳輸
網絡
Python對bytes類型的數據用帶b前綴的單引號或雙引號表示:函數
x = b'ABC' 要注意區分'ABC'和b'ABC',前者是str,後者雖然內容顯示得和前者同樣,但 **bytes的每一個字符都只佔用一個字節。**
以Unicode表示的str經過 encode() 方法能夠編碼爲指定的bytes,例如:編碼
>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87' >>> '中文'.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 純英文的str能夠用ASCII編碼爲bytes,內容是同樣的,含有中文的str能夠用UTF-8編碼爲bytes。含有中文的str沒法用ASCII編碼,由於中文編碼的範圍超過了ASCII編碼的範圍,Python會報錯。
在bytes中,沒法顯示爲ASCII字符的字節,用\x##顯示。code
反過來,若是咱們從網絡或磁盤上讀取了字節流,那麼讀到的數據就是bytes。要把bytes變爲str,就須要用decode()方法:htm
>>> b'ABC'.decode('ascii') 'ABC' >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') '中文'
要計算str包含多少個字符,能夠用len()函數:blog
>>> len('ABC') 3 >>> len('中文') 2 len()函數計算的是str的字符數,若是換成bytes,len()函數就計算字節數: >>> len(b'ABC') 3 >>> len(b'\xe4\xb8\xad\xe6\x96\x87') 6 >>> len('中文'.encode('utf-8')) 6 可見,1箇中文字符通過UTF-8編碼後一般會佔用3個字節,而1個英文字符只佔用1個字節。
在操做字符串時,咱們常常遇到str和bytes的互相轉換。爲了不亂碼問題,應當始終堅持使用UTF-8編碼對str和bytes進行轉換。內存
因爲Python源代碼也是一個文本文件,因此,當你的源代碼中包含中文的時候,在保存源代碼時,就須要務必指定保存爲UTF-8編碼。當Python解釋器讀取源代碼時,爲了讓它按UTF-8編碼讀取,咱們一般在文件開頭寫上這兩行:utf-8
#!/usr/bin/env python # -*- coding: utf-8 -*- 第一行註釋是爲了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個註釋; 第二行註釋是爲了告訴Python解釋器,按照UTF-8編碼讀取源代碼,不然,你在源代碼中寫的中文輸出可能會有亂碼。
# author = "zhuyouen" msg = "我愛北京天安門" print(msg) print(msg.encode('utf-8')) print(msg.encode('utf-8').decode('utf-8')) D:\python35\python.exe D:/PycharmProjects/zhuyouen/0402/encoding.py 我愛北京天安門 b'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8' 我愛北京天安門