假設讀者已經了解了什么叫字符集,什么叫編碼,什么叫解碼。
首先要明確,雖然有三種前綴(無前綴,前綴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()
版權聲明:本文為CSDN博主「anlian523」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/anlian523/article/details/80504699