python3編碼與解碼

一、字節流與字符串的轉換

內置函數bytes()與str()

bytes()函數能夠將字符串按照某一編碼規範轉換爲字節流。其中第一個參數爲字符串,第二個參數爲編碼規範(必填)。若是第一個參數是僅由ascii碼字符(ascii碼字符是unicode碼字符的子集)組成的,則字節流直接以ascii碼字符顯示。若是不是的話,則在按照不一樣的編碼規範顯示。在utf-8編碼下,一個漢子佔三個字節(一個字節是8位二進制數,可用2個16進制數表示),因而一個漢字能夠表示爲b'\x00\x00\x00'的形式。在unicode編碼下,一個漢字佔2個字節,可用4個16進制數表示,因而一個漢字能夠表示爲b'\u0000'。python

>>> hw = '好玩'
>>> bytes(hw,'utf-8')    #utf-8編碼
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> bytes(hw,'unicode-escape')    #unicode編碼
b'\\u597d\\u73a9'
>>> bytes(hw,'gbk')    #gbk編碼
b'\xba\xc3\xcd\xe6'
>>> bytes(hw,'gb2312')	#gb2312編碼
b'\xba\xc3\xcd\xe6'

與bytes()函數相對應的是內置函數str(),str()函數的一個功能是能將某一編碼下的字節流解碼爲字符串。函數

>>> hw = '好玩'
>>> b_utf = bytes(hw,'utf-8')
>>> b_utf
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> str(b_utf,'utf-8')
'好玩'

>>> b_uni = bytes(hw,'unicode-escape')
>>> b_uni
b'\\u597d\\u73a9'
>>> str(b_uni,'unicode-escape')
'好玩'

>>> b_gbk = bytes(hw,'gbk')
>>> b_gbk
b'\xba\xc3\xcd\xe6'
>>> str(b_gbk,'gbk')
'好玩'

字符串函數encode()與decode()

python還能夠對字符串進行編碼和解碼,這裏的字符串通常是指人類可以識別的具備語義的符號。使用函數encode()進行編碼,使用函數decode()對字節流進行解碼。所謂編碼就是將字符串轉換成計算機能讀懂的字節流,所謂解碼就是將字節流轉化成字符串。與bytes相比,encode()和decode()具備默認的編碼格式utf-8,而bytes()必須制定編碼格式。編碼

# 字符串編碼函數encode()
>>> hw
'好玩'
>>> hw.encode()
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> hw.encode('utf-8')	#因而可知utf-8是默認的編碼格式
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> hw.encode('gbk')
b'\xba\xc3\xcd\xe6'
>>> hw.encode('unicode-escape')
b'\\u597d\\u73a9'
>>> hw.encode('gb2312')
b'\xba\xc3\xcd\xe6'

# 字符串解碼函數decode()
>>> hw
'好玩'
>>> hw_d = hw.encode('utf-8')
>>> hw_d
b'\xe5\xa5\xbd\xe7\x8e\xa9'
>>> hw_d.decode()
'好玩'

二、字符的unicode編碼

字符經過內置函數ord()與chr()進行編碼,ord()能夠返回單一字符的Unicode編碼,chr()能夠返回與Unicode編碼相對於的單一字符。code

# ord()函數10進制的形式返回一個字符的Unicode編碼
>>> ord('中')
20013
>>> ord('A')
65
>>> ord('9')
57

# chr()函數能夠返回各類進制下Unicode編碼的字符
# 1)'A'的十進制Unicode編碼是65,如下分別將其轉化爲二進制、八進制、十六進制
>>> bin(65)
'0b1000001'
>>> oct(65)
'0o101'
>>> hex(65)
'0x41'

# 2)利用chr()函數將不一樣進制下的Unicode編碼轉換成Unicode字符,ascii碼是Unicode碼的子集。
>>> chr(65)
'A'
>>> chr(0b1000001)
'A'
>>> chr(0o101)
'A'
>>> chr(0x41)
'A'

三、字符與bytes的聯繫

# 經過內置函數bytes()獲得'好'的Unicode編碼
>>> h = '好'
>>> bytes(h,'unicode-escape')
b'\\u597d'

# 經過內置函數ord()獲得'好'的unicode編碼的序數形式
>>> ord(h)
22909

# 驗證經過bytes()與ord()獲得的Unicode編碼是否一致
>>> bytes(h,'unicode-escape')
b'\\u597d'
>>> bin(int('5',16))	#如下分別求五、九、七、d的二進制數
'0b101'
>>> bin(int('9',16))
'0b1001'
>>> bin(int('7',16))
'0b111'
>>> bin(int('d',16))
'0b1101'
>>> int('101100101111101',2)	#將二進制數拼接起來計算其十進制數
22909

經過以上實驗能夠獲得結論:使用內置函數ord()得到的unicode編碼與經過內置函數bytes()得到的unicode編碼相一致,只是展示形式不一樣而已。utf-8

相關文章
相關標籤/搜索