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ì)按照開頭的encoding來(lái)編碼成對(duì)應(yīng)的字節(jié)。
賦值的時(shí)候在字符串前面加個(gè)u,類型則為unicode,直接按照unicode編碼成兩個(gè)字節(jié)。
# coding=utf-8 s1 = "字節(jié)串" print(type(s1)) #輸出 <type 'str'>,按照開頭的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中是不相等的 # 這里的”字符是用開頭的encoding聲明解釋的,我開頭用的是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ù)里面幫你處理了編碼問題。
二、python3的字符串類型
python3中,字符串是以Unicode編碼的,是str類型。
如果要在網(wǎng)絡(luò)上傳輸,或者保存到磁盤,就需要把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ò)或磁盤上讀取的字節(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)文章
django虛擬環(huán)境(virtualenv)的創(chuàng)建
在使用django開發(fā)項(xiàng)目的時(shí)候,一個(gè)環(huán)境只能對(duì)應(yīng)一個(gè)項(xiàng)目,若不安裝虛擬環(huán)境、都裝在系統(tǒng)里面,每次項(xiàng)目加載都需要加載所有的安裝包,本文就介紹django虛擬環(huán)境的安裝,感興趣的可以了解一下2021-08-08
Django中利用filter與simple_tag為前端自定義函數(shù)的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了Django中利用filter與simple_tag為前端自定義函數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06
Python實(shí)現(xiàn)的計(jì)算器功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的計(jì)算器功能,涉及Python四則運(yùn)算、取反、百分比等相關(guān)數(shù)學(xué)運(yùn)算操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04
Python使用functools實(shí)現(xiàn)注解同步方法
這篇文章主要介紹了Python使用functools實(shí)現(xiàn)注解同步方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Python2到Python3的遷移過(guò)程中報(bào)錯(cuò)AttributeError: ‘str‘ objec
在 Python 編程過(guò)程中,AttributeError: 'str' object has no attribute 'decode' 是一個(gè)常見的錯(cuò)誤,這通常會(huì)在處理字符串時(shí)出現(xiàn),尤其是在 Python 2 到 Python 3 的遷移過(guò)程中,本文將詳細(xì)介紹該問題的根源,并提供解決方案,需要的朋友可以參考下2025-04-04
Tensorflow實(shí)現(xiàn)酸奶銷量預(yù)測(cè)分析
這篇文章主要為大家詳細(xì)介紹了Tensorflow酸奶銷量預(yù)測(cè)分析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07

