此學習筆記參考廖雪峰
字符串編碼的發(fā)展歷史
- 字符串也是一種數(shù)據(jù)類型湾盗,但是崇渗,字符串比較特殊的是還有一個編碼問題旋廷。由于計算機是美國人發(fā)明的,因此宙搬,最早只有127個字符被編碼到計算機里,也就是大小寫英文字母拓哺、數(shù)字和一些符號勇垛,這個編碼表被稱為
ASCII
編碼。 - 但是要處理中文顯然一個字節(jié)是不夠的士鸥,至少需要兩個字節(jié)闲孤,而且還不能和ASCII編碼沖突,所以础淤,中國制定了
GB2312
編碼崭放,用來把中文編進去。 - 全世界有上百種語言, 各國有不同的編碼鸽凶,就會不可避免地出現(xiàn)沖突币砂,結(jié)果就是,在多語言混合的文本中玻侥,顯示出來會有亂碼决摧。因此,
Unicode
應運而生。Unicode把所有語言都統(tǒng)一到一套編碼里掌桩,這樣就不會再有亂碼問題了边锁。 - ASCII編碼和Unicode編碼的區(qū)別:
ASCII
編碼是1個字節(jié),而Unicode
編碼通常是2個字節(jié)波岛。 - 用Unicode編碼比ASCII編碼需要多一倍的存儲空間茅坛,在存儲和傳輸上就十分不劃算。本著節(jié)約的精神则拷,又出現(xiàn)了把Unicode編碼轉(zhuǎn)化為“可變長編碼”的
UTF-8
編碼。UTF-8編碼把一個Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個字節(jié)煌茬,常用的英文字母被編碼成1個字節(jié)斥铺,漢字通常是3個字節(jié)坛善,只有很生僻的字符才會被編碼成4-6個字節(jié)。 - 在計算機內(nèi)存中眠屎,統(tǒng)一使用Unicode編碼剔交,當需要保存到硬盤或者需要傳輸的時候,就轉(zhuǎn)換為UTF-8編碼组力。
Python的字符串以及編碼與解碼
在最新的Python 3版本中抖拴,字符串是以Unicode編碼的燎字,也就是說阿宅,Python的字符串支持多語言候衍。
- 對于單個字符的編碼,Python提供了
ord()
函數(shù)獲取字符的整數(shù)表示洒放,chr()
函數(shù)把編碼轉(zhuǎn)換為對應的字符蛉鹿。 - 在python3 中,文本總是Unicode往湿,由
str
類型表示,二進制數(shù)據(jù)則由bytes
類型表示领追。字符串可以編碼成字節(jié)包,而字節(jié)包可以解碼成字符串(Ref)棕孙。
字符串和字節(jié)包的關(guān)系 - Python對
bytes
類型的數(shù)據(jù)用帶b
前綴的單引號或雙引號表示。要注意區(qū)分'ABC'
和b'ABC'
蟀俊,前者是str
,后者雖然內(nèi)容顯示得和前者一樣肢预,但bytes
的每個字符都只占用一個字節(jié)。 - 以
Unicode
表示的str
通過encode()
方法可以編碼為指定的bytes
;
反過來烫映,如果我們從網(wǎng)絡或磁盤上讀取了字節(jié)流,那么讀到的數(shù)據(jù)就是bytes
窑邦。要把bytes
變?yōu)?code>str,就需要用decode()
方法. - 在操作字符串時冈钦,我們經(jīng)常遇到
str
和bytes
的互相轉(zhuǎn)換。為了避免亂碼問題厉熟,應當始終堅持使用UTF-8
編碼對str
和bytes
進行轉(zhuǎn)換。 - 由于Python源代碼也是一個文本文件揍瑟,所以乍炉,當你的源代碼中包含中文的時候绢片,在保存源代碼時岛琼,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時槐瑞,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
- 申明了UTF-8編碼并不意味著你的.py文件就是UTF-8編碼的困檩,必須并且要確保文本編輯器正在使用UTF-8 without BOM編碼
格式化的字符串
在Python中祠挫,采用的格式化方式和C語言是一致的,用%
實現(xiàn)等舔。
占位符 | 替換內(nèi)容 |
---|---|
%d |
整數(shù) |
%f |
浮點數(shù) |
%s |
字符串 |
%x |
十六進制整數(shù) |
格式化整數(shù)和浮點數(shù)還可以指定是否補0和整數(shù)與小數(shù)的位數(shù)显沈,例如:
In [20]: print('%2d-%02d' % (3, 1))
3-01
其中%2d
表示兩位精度整數(shù)软瞎,%02d
表示兩位整數(shù),并且用0補位涤浇。
- 如果你不太確定應該用什么,%s永遠起作用著恩,它會把任何數(shù)據(jù)類型轉(zhuǎn)換為字符串: