從零開始學Python-Day8-字符串和編碼

字符編碼

字符串其實也是一種數據類型,但是字符串還有一個煩人的問題是編碼。


從零開始學Python-Day8-字符串和編碼

我們知道計算機智能處理數字,如果要計算機處理文本,就必須先把文本轉換為數字。最早的計算機採用8個比特為一個字節,一個字節能表示的最大整數就是255(八位二進制最大數11111111=十進制255),想表示更大的數就需要更多的字節。兩個字節可以表示的最大數就是二進制下16個1即1111111111111111等於十進制下65535。

最早計算機只使用在英語範圍內,所以最早只有127個字符,也就是英文大小寫、數字和一些符號,這個編碼表就是ASCII編碼。這要處理中文明顯不夠,至少需要兩個字節,所以中國製定了自己的GB2312編碼。就這樣各國產生了各國的標準,不可避免的會發生衝突,所以早期軟件多語言混合的文本會顯示亂碼。於是發展出了Unicode,它把所有語言統一到一套編碼,就解決了亂碼的問題。

後來為了解決Unicode編碼體型過大,方便傳輸和存儲的目的,發展出了UTF-8,我們現在網頁源碼上最常見的信息就表明該網頁是UTF-8編碼,Python編寫過程中也要做相應的標註,告訴Python解釋器讀取源碼時按照UTF-8編碼讀取。

<code># -*- coding: UTF-8 -*-/<code>

在計算機內存中,統一使用的是Unicode編碼,當需要保存或者傳輸時,轉換為UTF-8編碼。

Python字符串

Python3中,字符串以Unicode編碼,也就是說Python支持多語言,例如:

<code>>>> print('你好!Hello!こんにちは!Bonjour!')
你好!Hello!こんにちは!Bonjour!/<code>

對於單字符編碼,Python提供了一個ord()函數,用來獲取字符的整數表示,chr()則把編碼轉換為對應的字符:

<code>>>> ord('木')
26408
>>> ord('O')
79
>>> ord('人')
20154
>>> chr(75)
'K'
>>> chr(24352)
'張'/<code>

知道了字符的整數編碼,我們可以用十六進制來寫,這兩種方式完全等效。

<code>>>> '\\\\u6728\\\\u4eba\\\\u5f20'
'木人張'/<code>

encode與decode

Python的字符串str,在內存中以Unicode編碼,一個字符會對應若干字節。如果要網絡傳輸或者存儲,就要把str變為以字節為單位的bytes。bytes類型:b左前綴單引號或雙引號

<code>x = b'ABC'/<code>

bytes在這裡每個字符只佔一個字節。encode:unicode編碼的str可以用encode()編碼為指定編碼的bytes

<code>>>> 'Woodmanzhang'.encode('ascii')
b'Woodmanzhang'
>>> 'Woodmanzhang'.encode('utf-8')
b'Woodmanzhang'
>>> '木人張'.encode('utf-8')
b'\\\\xe6\\\\x9c\\\\xa8\\\\xe4\\\\xba\\\\xba\\\\xe5\\\\xbc\\\\xa0'
>>> '木人張'.encode('ascii')
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
'木人張'.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)/<module>/<pyshell>/<code>

中文超出了ASCII編碼範圍,就直接報錯了。bytes中無法ASCII編碼的字節,用\\\\x##顯示

decode:從網絡或磁盤讀取的數據是bytes,使用decode()解碼為str

<code>>>> b'Woodmanzhang'.decode('ascii')
'Woodmanzhang'
>>> b'\\\\xe6\\\\x9c\\\\xa8\\\\xe4\\\\xba\\\\xba\\\\xe5\\\\xbc\\\\xa0'.decode('utf-8')
'木人張'/<code>

如果bytes中含有無法解碼的字節,decode會報錯,可以使用errors=’ignore’忽略錯誤


從零開始學Python-Day8-字符串和編碼


len()函數

用來統計字符串str包含多少字符,如果括號內換成bytes,統計計算的就是字節數

<code>>>> len('Woodmanzhang')
12
>>> len('木人張')
3
>>> len(b'Woodmanzhang')
12
>>> len('木人張'.encode('utf-8'))
9
>>> len(b'\\\\xe6\\\\x9c\\\\xa8\\\\xe4\\\\xba\\\\xba\\\\xe5\\\\xbc\\\\xa0')
9/<code>

格式化

我們經常收到短信或者提示信息:“親愛的XX你好,你XX月話費XX元,餘額XX元。”這裡XXX是變化的變量,所以需要一種格式化字符串的方式在管理這些數據。Python格式化使用%實現

<code>>>> 'Hello,%s' % '木人張'
'Hello,木人張'
>>> '你好,%s,您的賬戶還有%d元。' %('木人張',1)
'你好,木人張,您的賬戶還有1元。'/<code>

%就是用來格式化字符串的,%佔位符有幾個,後面就有幾個變量,或者直接賦值,按順序對應。如果只有一個佔位符,可以去掉括號。佔位符 替換內容%d 整數%f 浮點數%s 字符串%x 十六進制整數格式化%指定補零和小數位數的使用:

<code>>>> print('%2d-%02d' % (3, 1)) 3-01
>>> print('%.2f' % 3.1415926)3.14/<code>

%s永遠起作用,把任意數據類型轉換為字符串

<code>>>> '年齡:%s.會員:%s' % (35,True)
'年齡:35.會員:True'/<code>

如果是要使用百分號%呢?用%來轉義%,也就是%%表示一個%(百分號)

<code>>>> '增長率:%d%%' % 10
'增長率:10%'/<code>

format()

格式化字符串的另一種方法,用傳入的參數依次替換字符串內的佔位符{0}、{1}、….

<code>>>> '你好,{0},您的成績提升了{1:.1f}%'.format('木人張',10.00)
'你好,木人張,您的成績提升了10.0%'/<code>

演示


從零開始學Python-Day8-字符串和編碼


分享到:


相關文章: