Python3編碼解碼與資料型別轉換
阿新 • • 發佈:2020-08-03
目錄
一、bytes物件與字串物件
1.1、bytes物件與字串物件實質
1)、bytes物件
python在進行資料的二進位制傳輸時,其直譯器層面都會使用bytes物件的方式傳輸。無論我們傳輸什麼型別的資料,比如gbk編碼型別,或者utf-8型別,最終都需要轉化為bytes物件傳輸,這一點類似於java的class,底層都是這樣的位元組碼。
2)、bytes存在三種寫法:
-
單引號: b'同樣允許嵌入 "雙" 引號'。
-
雙引號: b"同樣允許嵌入 '單' 引號"。
-
三重引號: b'''三重單引號''', b"""三重雙引號"""
3)、str物件
我們從網上覆制來的資料,貼上在程式碼中,或者從電腦的檔案中讀取的資料都是str物件。可以用type()函式檢視其型別。而str物件傳輸時就需要轉換成bytes物件。
4)、str物件的寫法
-
單引號: '同樣允許嵌入 "雙" 引號'。
-
雙引號: "同樣允許嵌入 '單' 引號"。
-
三重引號: '''三重單引號''', b"""三重雙引號"""
1.2、bytes與str物件轉換
1)、bytes轉str
bytes存在內建函式decode(),我們使用這個函式時僅需控制decode的型別,即是將bytes按什麼樣的方式組織成字串,比如按照utf-8的型別組織,就可以理解為python直譯器獲取010101的資料,轉換成bytes後按照utf-8形式組成字串。
這個是bytes按照utf-8的編碼將\x64\x6f\x67轉換字串
>f = b"\x64\x6f\x67" >print(f.decode("utf-8")) >dog
2)、str轉bytes
這個是字串轉換成bytes
>c="dog"
>print(c.encode("utf-8"))
>b'dog'
理解了這個實質,大部分的編碼轉換失敗問題就可以往這兩個相互轉換上理解,就可以解決
二、字串物件的資料型別轉換
2.1、ascii串形式<-->hex字串
ascii串形式就是我們通常意義上理解的字串,也包括回車等不可見字元
hex指的是表現形式為0-f的字串物件
import binascii
def str_to_hexStr(string):
str_bin = string.encode('utf-8')
return binascii.b2a_hex(str_bin).decode('utf-8') or binascii.hexlify(str_bin).decode('utf-8')
def str_to_hexStr(string):
str_bin = string.encode('utf-8')
return binascii.a2b_hex(str_bin).decode('utf-8') or binascii.unhexlify(str_bin).decode('utf-8')
f = "xxxxxx"
a = str_to_hexStr(f)
print(a)
s = "787878787878"
b = str_to_hexStr(s)
print(b)
>>>787878787878
>>>xxxxxx
一定要注意其中存在的資料物件轉換
2.2、ascii串形式<-->bin字串
def binToStr(binStr):
return "".join(format(chr(int(binary_value, 2))) for binary_value in binStr.split())
def strToBin(asciiStr):
return ' '.join(format(ord(x), 'b') for x in asciiStr)
print(binToStr("01100001 01100010 01100011"))
print(strToBin("xxxxxxxxfdsd55"))
>>>abc
>>>1111000 1111000 1111000 1111000 1111000 1111000 1111000 1111000 1100110 1100100 1110011 1100100 110101 110101
2.3、ascii串形式<-->base64字串
import base64
s = "nihao"
res = base64.b64encode(s.encode("utf-8")).decode('utf-8')
print(res)
s1 = "bmloYW8="
res1 = base64.b64decode(s1.encode("utf-8")).decode("utf-8")
print(res1)
>>>bmloYW8=
>>>nihao
2.4、ascii串形式<-->unicode字串
#unicode串轉ascii串,可包括中文
s = "\u006e\u0069\u0068\u0061\u006f"
res = s.encode("unicode_escape").decode("unicode_escape")
print(res)
#中文或ascii轉成unicode串
s1 = "你好"
def strToUnicode(asciiStr):
return "".join(str(hex(ord((x)))).replace("0x","\\u00") for x in asciiStr)
print(strToUnicode(s1))