本章目錄
- Part One:字符編碼
- Part Two:字符串
- Part Three:字符串格式化
字符串可以說(shuō)是所有變成語(yǔ)言中應(yīng)用最廣泛的數(shù)據(jù)類型,Python也不例外部翘。而處理字符串,首先需要注意的就是編碼問(wèn)題本今。
字符編碼
計(jì)算機(jī)的本質(zhì)其實(shí)就是由0和1組成的纱耻,所以說(shuō)無(wú)論是中文還是英文字符串领突,最終都要轉(zhuǎn)換為數(shù)字荐健。
最早只有127個(gè)字符被編碼到計(jì)算機(jī)里酱畅,也就是大小寫英文字母、數(shù)字和一些符號(hào)江场,這個(gè)編碼表被稱為ASCII編碼纺酸。
但是要處理中文顯然一個(gè)字節(jié)是不夠的,至少需要兩個(gè)字節(jié)址否,而且還不能和ASCII編碼沖突餐蔬,所以,中國(guó)制定了GB2312編碼佑附,用來(lái)把中文編進(jìn)去樊诺。
后來(lái)呢,為了處理更多的語(yǔ)言音同,Unicode應(yīng)運(yùn)而生啄骇。Unicode把所有語(yǔ)言都統(tǒng)一到一套編碼里,這樣就不會(huì)再有亂碼問(wèn)題了瘟斜。
Python2.x系列就是用的ASCII編碼,而Python3.x就開(kāi)始使用unicode了痪寻,這樣中文顯示問(wèn)題就有了很大的改善填物。這里打印了一下windows下Python3.6的各種編碼:
可以看到娶桦,基本統(tǒng)一為了utf-8。那么什么是utf-8呢?utf-8其實(shí)是一個(gè)可變長(zhǎng)編碼啦逆。它把一個(gè)Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個(gè)字節(jié),常用的英文字母被編碼成1個(gè)字節(jié)齐媒,漢字通常是3個(gè)字節(jié)巷帝,只有很生僻的字符才會(huì)被編碼成4-6個(gè)字節(jié)。如果你要傳輸?shù)奈谋景罅坑⑽淖址新拢肬TF-8編碼就能節(jié)省空間:
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
從上面的表格還可以發(fā)現(xiàn)谱邪,UTF-8編碼有一個(gè)額外的好處,就是ASCII編碼實(shí)際上可以被看成是UTF-8編碼的一部分庶诡,所以惦银,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續(xù)工作。
在計(jì)算機(jī)內(nèi)存中,統(tǒng)一使用Unicode編碼扯俱,當(dāng)需要保存到硬盤或者需要傳輸?shù)臅r(shí)候书蚪,就轉(zhuǎn)換為UTF-8編碼。
用記事本編輯的時(shí)候迅栅,從文件讀取的UTF-8字符被轉(zhuǎn)換為Unicode字符到內(nèi)存里殊校,編輯完成后,保存的時(shí)候再把Unicode轉(zhuǎn)換為UTF-8保存到文件:
字符串
字符串就是用單引號(hào)(')或者雙引號(hào)("")包裹起來(lái)的文字读存,在Python風(fēng)格規(guī)范里推薦一個(gè)模塊使用一種符號(hào)作為字符串表示为流。在字符串內(nèi)可以使用另外一種引號(hào), 以避免在字符串中使用。
例如:
print('Why are you hiding your eyes?')
print("I'm scared of lint errors.")
print('"Good!" thought a happy Python reviewer.')
結(jié)果為:
所以說(shuō)宪萄,除非想在字符串內(nèi)包含單引號(hào)或者雙引號(hào)艺谆,每一個(gè)Python文件最好使用同一種符號(hào)。
對(duì)于單個(gè)字符的編碼拜英,Python提供了ord()函數(shù)獲取字符的整數(shù)表示静汤,chr()函數(shù)把編碼轉(zhuǎn)換為對(duì)應(yīng)的字符:
如果知道字符的整數(shù)編碼,還可以用十六進(jìn)制這么寫str(unicode方式):
如果要在網(wǎng)絡(luò)上傳輸居凶,或者保存到磁盤上虫给,就需要把str變?yōu)橐宰止?jié)為單位的bytes。Python對(duì)bytes類型的數(shù)據(jù)用帶b前綴的單引號(hào)或雙引號(hào)表示:
var = b"ABC"
要注意區(qū)分'ABC'和b'ABC'侠碧,前者是str抹估,后者雖然內(nèi)容顯示得和前者一樣,但bytes的每個(gè)字符都只占用一個(gè)字節(jié)弄兜。
以Unicode表示的str通過(guò)encode()方法可以編碼為指定的bytes药蜻,例如:
純英文的str可以用ASCII編碼為bytes,內(nèi)容是一樣的替饿,含有中文的str可以用UTF-8編碼為bytes语泽。含有中文的str無(wú)法用ASCII編碼,因?yàn)橹形木幋a的范圍超過(guò)了ASCII編碼的范圍视卢,Python會(huì)報(bào)錯(cuò)踱卵。
反過(guò)來(lái),從bytes到str可以用decode方法据过,原理和操作都是一樣的惋砂,不再贅述了。
最后绳锅,可以看下len方法西饵,len是length的縮寫,翻譯過(guò)來(lái)就是計(jì)算str或者bytes的字符字節(jié)數(shù)榨呆,例如:
可見(jiàn)罗标,1個(gè)中文字符經(jīng)過(guò)UTF-8編碼后通常會(huì)占用3個(gè)字節(jié)庸队,而1個(gè)英文字符只占用1個(gè)字節(jié)。
在操作字符串時(shí)闯割,我們經(jīng)常遇到str和bytes的互相轉(zhuǎn)換彻消。為了避免亂碼問(wèn)題,應(yīng)當(dāng)始終堅(jiān)持使用UTF-8編碼對(duì)str和bytes進(jìn)行轉(zhuǎn)換宙拉。
還有其它一些常用的方法宾尚,如spli(分割), join(拼接)谢澈,replace(替換)煌贴,upper(大寫),lower(小寫)锥忿,strip(去除兩端空格)牛郑,lstrip(去除左端空格),rstrip(去除右端空格)等敬鬓,用法都比較簡(jiǎn)單淹朋,可參考源碼調(diào)用即可。
字符串格式化
-
字符串格式化就是在指定位置先放一個(gè)占位符钉答,然后用變量來(lái)替換础芍,這樣就可以以相同的格式輸出不同的內(nèi)容。
最簡(jiǎn)單的案例如下圖所示:
字符串格式化.png
其中数尿,占位符常用的有:
占位符 | 替換內(nèi)容 |
---|---|
%d | 整數(shù) |
%f | 浮點(diǎn)數(shù) |
%s | 字符串 |
%x | 十六進(jìn)制整數(shù) |
還有很多其它占位符仑性,不太常用,需要的時(shí)候再去查就好了右蹦。
另外诊杆,如果不確定,可以使用字符串占位符何陆,因?yàn)槠渌愋投嫁D(zhuǎn)化為字符串刽辙。
-
有種說(shuō)法是%號(hào)的方式已經(jīng)過(guò)時(shí)了,用format方法來(lái)操作字符串格式化更合適甲献。
相對(duì)來(lái)說(shuō),個(gè)人還是喜歡format形式多一些颂翼,感覺(jué)更規(guī)范晃洒。
format形式的基礎(chǔ)用法就是用{0},{1}...來(lái)代替站位符朦乏,如果用{}代表使用默認(rèn)順序球及,例如:
format格式化.png
另外,還有一些比較詳細(xì)的用法:
format格式化進(jìn)階.png