在python2中有兩種字符類型: str(bytes)和unicode , 系統(tǒng)默認(rèn) str(bytes)
在python3中也有兩種字符類型: bytes 和 str(unicode) 系統(tǒng)默認(rèn) str(unicode)
在編碼界,每種編碼都有一張編碼表,記錄的是對(duì)應(yīng)的字符與數(shù)字的對(duì)應(yīng)關(guān)系.
我們所看到程序顯示的字符都是編碼表映射的字符,在計(jì)算機(jī)世界里其實(shí)就是一串?dāng)?shù)字
簡單理解就是:字節(jié)是計(jì)算機(jī)的語言,字符串是人類語言,它們之間通過編碼表形成一一對(duì)應(yīng)的關(guān)系
字節(jié)也叫做字節(jié)數(shù)組是二進(jìn)制數(shù)據(jù)組成的序列, 1字節(jié) == 8bit == 2位16進(jìn)制數(shù) == 數(shù)字0~255
ASCII編碼占用一字節(jié),且只用到了一字節(jié)中的一部分(31~27)
unicode和bytes的轉(zhuǎn)換
unicode --encode--> bytes
bytes --decode--> unicode
1bytes(字節(jié)) = 8位二進(jìn)制位(bit)
二進(jìn)制位的數(shù)值只有0和1,也就是說8位0或1組成一字節(jié)(bytes)
其實(shí)bytes就是ASCII碼
中文和字母在不同編碼中占用的字節(jié)
英文字母:
字節(jié)數(shù) : 1;編碼:GB2312
字節(jié)數(shù) : 1;編碼:GBK
字節(jié)數(shù) : 1;編碼:GB18030
字節(jié)數(shù) : 1;編碼:ISO-8859-1
字節(jié)數(shù) : 1;編碼:UTF-8
字節(jié)數(shù) : 4;編碼:UTF-16
字節(jié)數(shù) : 2;編碼:UTF-16BE
字節(jié)數(shù) : 2;編碼:UTF-16LE
中文漢字:
字節(jié)數(shù) : 2;編碼:GB2312
字節(jié)數(shù) : 2;編碼:GBK
字節(jié)數(shù) : 2;編碼:GB18030
字節(jié)數(shù) : 1;編碼:ISO-8859-1
字節(jié)數(shù) : 3;編碼:UTF-8
字節(jié)數(shù) : 4;編碼:UTF-16
字節(jié)數(shù) : 2;編碼:UTF-16BE
字節(jié)數(shù) : 2;編碼:UTF-16LE
代碼示例: python3環(huán)境
英文字符在unicode和bytes的區(qū)別
s1 = "aaa"
print(type(s1),len(s1))
>><class 'str'> 3
b1 = s1.encode("utf-8")
b2 = b"aaa"
print(type(b1),type(b2),b1==b2,len(s1)==len(b2))
>><class 'bytes'> <class 'bytes'> True True
上面的示例可以看出英文字符在unicode和bytes中占相同的字節(jié)
中文字母
s1 = "中"
print(type(s1),len(s1))
>><class 'str'> 1
b1 = s1.encode("utf-8")
# b2 = b"中文" # 注意不能這樣寫,這樣寫是會(huì)報(bào)錯(cuò)的
print(type(b1),b1,len(b1))
>><class 'bytes'> b'\xe4\xb8\xad' 3
上面的示例其實(shí)就可以看出,python3默認(rèn)使用unicode字符,采用的默認(rèn)編碼是utf-8,以及一個(gè)中文占3個(gè)字節(jié)長度,所以在轉(zhuǎn)換編碼傳輸?shù)臅r(shí)候要注意數(shù)據(jù)的真正長度