欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中的字符串類型解讀

 更新時(shí)間:2024年06月24日 10:00:46   作者:冰美式QAQ  
這篇文章主要介紹了python中的字符串類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、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'>
3

Process 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)文章

最新評(píng)論