python中的字符串類型解讀
一、python2的字符串類型
在python2中,字符串一般有兩種類型,unicode和str。(python3中是Unicode類型)
- str類型,字節(jié)碼類型,根據(jù)某種編碼把字符串轉(zhuǎn)成對(duì)應(yīng)的字節(jié),一個(gè)字符根據(jù)不同的編碼規(guī)則對(duì)應(yīng)不同的字節(jié)數(shù)。GBK編碼一個(gè)字符對(duì)應(yīng)兩個(gè)字節(jié)。
- unicode類型,則是用unicode編碼的字符串,一個(gè)字符對(duì)應(yīng)兩個(gè)字節(jié)。
直接賦值字符串,類型為str,str為字節(jié)串,會(huì)按照開(kāi)頭的encoding來(lái)編碼成對(duì)應(yīng)的字節(jié)。
賦值的時(shí)候在字符串前面加個(gè)u,類型則為unicode,直接按照unicode編碼成兩個(gè)字節(jié)。
# coding=utf-8 s1 = "字節(jié)串" print(type(s1)) #輸出 <type 'str'>,按照開(kāi)頭的encoding來(lái)編碼成相應(yīng)的字節(jié) print(len(s1)) #輸出9,因?yàn)榘磚tf8編碼,一個(gè)漢字占3個(gè)字節(jié),3個(gè)字就占9個(gè)字節(jié) s2 = u"萬(wàn)國(guó)碼" print(type(s2)) #輸出 <type 'unicode'>,用unicode編碼,2個(gè)字節(jié)1個(gè)字符 print(len(s2)) #輸出3,unicode用字符個(gè)數(shù)來(lái)算長(zhǎng)度,從這個(gè)角度上看,unicode才是真正意義上的字符串類型
E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/1.py
<type 'str'>
9
<type 'unicode'>
3Process finished with exit code 0
再舉個(gè)例子:
比如要從一個(gè)文件中找出所有后兩位是’字符’的詞語(yǔ),在進(jìn)行判斷的時(shí)候:
# coding=utf-8 s = '中文字符' s[-2:] == '字符‘ # 返回false,本以為相等但在python2中是不相等的 # 這里的”字符是用開(kāi)頭的encoding聲明解釋的,我開(kāi)頭用的是utf8,漢字占3個(gè)字節(jié),所以“字符”占了6個(gè)字節(jié)),而s[-2:]取的是最后兩個(gè)”雙字節(jié)“,所以不相同。 s = u'中文字符' s[-2:] == u'字符' # 加u強(qiáng)制轉(zhuǎn)換成unicode # 返回true,這也是為什么說(shuō)unicode是真正意義上的字符串類型。因?yàn)槭褂玫氖莡nicode,”字符“占的是兩個(gè)”雙字節(jié)“,一個(gè)"雙字節(jié)“一個(gè)字。
對(duì)于經(jīng)常處理中文字符串的人,統(tǒng)一用unicode(加u強(qiáng)制轉(zhuǎn)換成unicode)就可以避免這個(gè)坑了。
雖然有些字符串處理函數(shù)用str也可以,應(yīng)該是函數(shù)里面幫你處理了編碼問(wèn)題。
二、python3的字符串類型
python3中,字符串是以Unicode編碼的,是str類型。
如果要在網(wǎng)絡(luò)上傳輸,或者保存到磁盤(pán),就需要把str變?yōu)橐宰止?jié)為單位的bytes。python3中對(duì)bytes類型的數(shù)據(jù)用帶b前綴的單引號(hào)或者雙引號(hào)表示。
以Unicode表示的str通過(guò)encode()方法可以編碼為指定的bytes。反過(guò)來(lái),從網(wǎng)絡(luò)或磁盤(pán)上讀取的字節(jié)流,即bytes,要把bytes變?yōu)閟tr,通過(guò)decode()方法。
>>> "ABC".encode("utf-8") b'ABC' >>> "中文".encode("utf-8") b'\xe4\xb8\xad\xe6\x96\x87' >>> '中文'.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) # 純英文的str可以用ASCII編碼為bytes,內(nèi)容是一樣的,含有中文的str可以用UTF-8編碼為bytes。 # 含有中文的str無(wú)法用ASCII編碼,因?yàn)橹形木幋a的范圍超過(guò)了ASCII編碼的范圍,Python會(huì)報(bào)錯(cuò) # 因?yàn)閜ython3中字符串類型是Unicode編碼的,所以不需要先decode成Unicode,直接encode成指定編碼的bytes
反過(guò)來(lái)
>>> b'ABC'.decode("utf-8") 'ABC' >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode("utf-8") '中文' >>>
三、python3字符函數(shù)舉例
len()函數(shù),str類型字符串調(diào)用時(shí),計(jì)算的是字符數(shù),bytes類型調(diào)用時(shí),計(jì)算的是字節(jié)數(shù)
>>> len(b'ABC') 3 >>> len(b'\xe4\xb8\xad\xe6\x96\x87') 6 >>> len('中文'.encode('utf-8')) 6 # 1個(gè)中文字符經(jīng)過(guò)UTF-8編碼后通常會(huì)占用3個(gè)字節(jié),而1個(gè)英文字符只占用1個(gè)字節(jié)
ord()
函數(shù),獲取單個(gè)字符的整數(shù)表示chr()
函數(shù),把單個(gè)字符的整數(shù)轉(zhuǎn)換為對(duì)應(yīng)的字符
C:\Users\xxx>python3 Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> ord("A") 65 >>> ord("中") 20013 >>> chr(65) 'A' >>> chr(25991) '文' >>>
- chardet.detect(str),查看字符串的編碼格式
- detect()函數(shù)接受一個(gè)參數(shù),一個(gè)非unicode字符串
它返回一個(gè)字典,其中包含自動(dòng)檢測(cè)到的字符編碼和從0到1的可信度級(jí)別。
encoding
:表示字符編碼方式;confidence
:表示可信度;language
:語(yǔ)言
# encoding: utf-8 import chardet s = "中文".encode("utf-8") print(chardet.detect(s))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
{'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}Process finished with exit code 0
檢測(cè)出的編碼是ascii,confidence字段表示檢測(cè)的概率是0.7525(即75.25%)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pytorch實(shí)現(xiàn)常用乘法算子TensorRT的示例代碼
pytorch 用于訓(xùn)練,TensorRT用于推理是很多AI應(yīng)用開(kāi)發(fā)的標(biāo)配。大家往往更加熟悉 pytorch 的算子,而不太熟悉TensorRT的算子。本文介紹了Pytorch中常用乘法的TensorRT實(shí)現(xiàn),感興趣的可以了解一下2022-06-06tensorboard實(shí)現(xiàn)同時(shí)顯示訓(xùn)練曲線和測(cè)試曲線
今天小編就為大家分享一篇tensorboard實(shí)現(xiàn)同時(shí)顯示訓(xùn)練曲線和測(cè)試曲線,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01PyQT實(shí)現(xiàn)菜單中的復(fù)制,全選和清空的功能的方法
今天小編就為大家分享一篇PyQT實(shí)現(xiàn)菜單中的復(fù)制,全選和清空的功能的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06Python抓取框架Scrapy爬蟲(chóng)入門(mén):頁(yè)面提取
Scrapy吸引人的地方在于它是一個(gè)框架,任何人都可以根據(jù)需求方便的修改,下面這篇文章主要給大家介紹了關(guān)于Python抓取框架Scrapy爬蟲(chóng)入門(mén)之頁(yè)面提取的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12Django之Mode的外鍵自關(guān)聯(lián)和引用未定義的Model方法
今天小編就為大家分享一篇Django之Mode的外鍵自關(guān)聯(lián)和引用未定義的Model方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python函數(shù)聲明和調(diào)用定義及原理詳解
這篇文章主要介紹了python函數(shù)聲明和調(diào)用定義及原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Python 實(shí)現(xiàn)鏈表實(shí)例代碼
這篇文章主要介紹了Python 實(shí)現(xiàn)鏈表實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04用Python編寫(xiě)一個(gè)簡(jiǎn)單的俄羅斯方塊游戲的教程
這篇文章主要介紹了用Python編寫(xiě)一個(gè)簡(jiǎn)單的俄羅斯方塊游戲的教程,編寫(xiě)俄羅斯方塊幾乎是每門(mén)編程語(yǔ)言基礎(chǔ)學(xué)習(xí)后的必備實(shí)踐,需要的朋友可以參考下2015-04-04