字符編碼我們已經(jīng)講過了,字符串也是一種數(shù)據(jù)類型,,但是,,字符串比較特殊的是還有一個編碼問題。 因為計算機(jī)只能處理數(shù)字,,如果要處理文本,,就必須先把文本轉(zhuǎn)換為數(shù)字才能處理,。最早的計算機(jī)在設(shè)計時采用8個比特(bit)作為一個字節(jié)(byte),所以,,一個字節(jié)能表示的最大的整數(shù)就是255(二進(jìn)制11111111=十進(jìn)制255),如果要表示更大的整數(shù),,就必須用更多的字節(jié),。比如兩個字節(jié)可以表示的最大整數(shù)是 由于計算機(jī)是美國人發(fā)明的,,因此,最早只有127個字母被編碼到計算機(jī)里,,也就是大小寫英文字母,、數(shù)字和一些符號,這個編碼表被稱為 但是要處理中文顯然一個字節(jié)是不夠的,,至少需要兩個字節(jié),,而且還不能和ASCII編碼沖突,所以,,中國制定了 你可以想得到的是,,全世界有上百種語言,,日本把日文編到 因此,,Unicode應(yīng)運(yùn)而生,。Unicode把所有語言都統(tǒng)一到一套編碼里,這樣就不會再有亂碼問題了,。 Unicode標(biāo)準(zhǔn)也在不斷發(fā)展,,但最常用的是用兩個字節(jié)表示一個字符(如果要用到非常偏僻的字符,就需要4個字節(jié))?,F(xiàn)代操作系統(tǒng)和大多數(shù)編程語言都直接支持Unicode,。 現(xiàn)在,,捋一捋ASCII編碼和Unicode編碼的區(qū)別:ASCII編碼是1個字節(jié),而Unicode編碼通常是2個字節(jié),。 字母 字符 漢字 你可以猜測,,如果把ASCII編碼的 新的問題又出現(xiàn)了:如果統(tǒng)一成Unicode編碼,亂碼問題從此消失了,。但是,,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,,在存儲和傳輸上就十分不劃算,。 所以,本著節(jié)約的精神,,又出現(xiàn)了把Unicode編碼轉(zhuǎn)化為“可變長編碼”的
從上面的表格還可以發(fā)現(xiàn),,UTF-8編碼有一個額外的好處,就是ASCII編碼實(shí)際上可以被看成是UTF-8編碼的一部分,,所以,,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續(xù)工作。 搞清楚了ASCII,、Unicode和UTF-8的關(guān)系,,我們就可以總結(jié)一下現(xiàn)在計算機(jī)系統(tǒng)通用的字符編碼工作方式: 在計算機(jī)內(nèi)存中,統(tǒng)一使用Unicode編碼,,當(dāng)需要保存到硬盤或者需要傳輸?shù)臅r候,,就轉(zhuǎn)換為UTF-8編碼,。 用記事本編輯的時候,從文件讀取的UTF-8字符被轉(zhuǎn)換為Unicode字符到內(nèi)存里,,編輯完成后,,保存的時候再把Unicode轉(zhuǎn)換為UTF-8保存到文件: 瀏覽網(wǎng)頁的時候,服務(wù)器會把動態(tài)生成的Unicode內(nèi)容轉(zhuǎn)換為UTF-8再傳輸?shù)綖g覽器: 所以你看到很多網(wǎng)頁的源碼上會有類似 Python的字符串搞清楚了令人頭疼的字符編碼問題后,我們再來研究Python對Unicode的支持,。 因為Python的誕生比Unicode標(biāo)準(zhǔn)發(fā)布的時間還要早,,所以最早的Python只支持ASCII編碼,,普通的字符串
Python在后來添加了對Unicode的支持,,以Unicode表示的字符串用
寫 兩種字符串如何相互轉(zhuǎn)換,?字符串 把
英文字符轉(zhuǎn)換后表示的UTF-8的值和Unicode值相等(但占用的存儲空間不同),,而中文字符轉(zhuǎn)換后1個Unicode字符將變?yōu)?個UTF-8字符,你看到的
反過來,,把UTF-8編碼表示的字符串
由于Python源代碼也是一個文本文件,所以,,當(dāng)你的源代碼中包含中文的時候,,在保存源代碼時,就需要務(wù)必指定保存為UTF-8編碼,。當(dāng)Python解釋器讀取源代碼時,,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
第一行注釋是為了告訴Linux/OS X系統(tǒng),,這是一個Python可執(zhí)行程序,,Windows系統(tǒng)會忽略這個注釋,; 第二行注釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,,否則,,你在源代碼中寫的中文輸出可能會有亂碼。 格式化最后一個常見的問題是如何輸出格式化的字符串,。我們經(jīng)常會輸出類似 在Python中,,采用的格式化方式和C語言是一致的,用
你可能猜到了,, 常見的占位符有:
其中,格式化整數(shù)和浮點(diǎn)數(shù)還可以指定是否補(bǔ)0和整數(shù)與小數(shù)的位數(shù):
如果你不太確定應(yīng)該用什么,,
對于Unicode字符串,用法完全一樣,,但最好確保替換的字符串也是Unicode字符串:
有些時候,,字符串里面的
小結(jié)由于歷史遺留問題,,Python 2.x版本雖然支持Unicode,但在語法上需要 Python當(dāng)然也支持其他編碼方式,,比如把Unicode編碼成GB2312:
但這種方式純屬自找麻煩,如果沒有特殊業(yè)務(wù)要求,,請牢記僅使用Unicode和UTF-8這兩種編碼方式,。 在Python 3.x版本中,,把 格式化字符串的時候,可以用Python的交互式命令行測試,,方便快捷,。 |
|