python字符串編碼轉換


假設讀者已經了解了什么叫字符集,什么叫編碼,什么叫解碼。

首先要明確,雖然有三種前綴(無前綴,前綴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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM