python3 三種字串(無字首,字首u,字首b)與encode()
假設讀者已經瞭解了什麼叫字符集,什麼叫編碼,什麼叫解碼。
首先要明確,雖然有三種字首(無字首,字首u,字首b),但是字串的型別只有兩種(str,bytes),實驗如下:
根據程式以及以上執行結果,發現無字首,和字首u,構造出來的字串常量,是一樣的。
型別一樣是str,長度一樣是3,==判斷也是返回true。is判斷也是返回true。
其實,這裡是因為,python3中,字串的儲存方式都是以Unicode字元來儲存的,所以字首帶不帶u,其實都一樣。
結論:字串常量,字首帶不帶u,都是一樣的。
不管是utf-8,還是gbk,都可以理解為一種對應關係(若干個十六進位制數<——>某個字元):
所以可以發現任何str型別的字串,在經過encode('utf-8')後,就是通過utf-8這種編碼解碼方式(兩種方向),將Unicode字元轉換為對應的以位元組方式儲存的若干十六進位制數。
根據如上程式以及結果,可以發現,utf-8用三個十六進位制來表示一箇中文字元,而gbk用二個十六進位制來表示一箇中文字元。
結論:encode()函式根據括號內的編碼方式,把str型別的字串轉換為bytes字串,字元對應的若干十六進位制數,根據編碼方式決定。
既然知道了,str實際儲存的是Unicode字元,那麼也可以Unicode編碼來儲存str,形如\u1234:
發現\u後面跟四個十六進位制數,就可以代表一個Unicode字元,同樣的,字首帶不帶u都一樣。
結論:str型別的字串,每個字元用字元本身或者\u1234,來表示都可以,後者則是直接是Unicode編碼。但列印時都是列印字元本身。
bytes字串的組成形式,必須是十六進位制數,或者ASCII字元:
提示錯誤:bytes只能包含ASCII字元。
在列印bytes字串時,某些正常字元和一些轉義字元可以打印出來,比如:字母數字和‘\n’換行符。別的就只能以原來的方式存在。
還可以對bytes取索引,所以這裡bytes也可以用for迴圈來迭代了,因為也是可迭代物件。
取索引,將所在元素的數,轉換為十進位制數。
程式碼:
oath = '我愛妞' print(type(oath)) print(len(oath)) oath1 = u'我愛妞' print(type(oath1)) print(len(oath1)) print(oath==oath1) utf8 = oath.encode('utf-8') print(type(utf8)) print(len(utf8)) print(utf8) gbk = oath.encode('gbk') print(type(gbk)) print(len(gbk)) print(gbk) out = open('test.txt','w',encoding = 'utf-8') test = u'\u5220\u9664' print(len(test)) print(test) test1 = test.encode('utf-8') print(test1) print(type(test1)) out.write(test) out.close()