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') '好玩'
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() '好玩'
字符經過內置函數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()獲得'好'的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