python學習—字元編碼 例如漢字“中” 十進位:20013 二進位:01001110 00101101(unicode)/11100100 10111000 10101101(utf-8) 十六進位:u4e2d 八進位: ascii ASCII編碼是1個位元組 只能編碼純英文 節省空間 unico ...
python學習—字元編碼
例如漢字“中”
十進位:20013
二進位:01001110 00101101(unicode)/11100100 10111000 10101101(utf-8)
十六進位:u4e2d
八進位:
ascii
- ASCII編碼是1個位元組
- 只能編碼純英文
- 節省空間
unicode
- Unicode編碼通常是2個位元組。(比如字母A用ASCII編碼是十進位的65,二進位的01000001;A的Unicode編碼是00000000 01000001。)
- uicode統一編碼,解決編碼衝突,亂碼問題消失
- 比ascii多一倍的存儲空間,存儲和傳送時不划算(UTF-8解決)
utf-8(可變長的unicode編碼)
UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。
字元 |
ASCII |
Unicode |
UTF-8 |
A |
01000001 |
00000000 01000001 |
01000001 |
中 |
x |
01001110 00101101 |
11100100 10111000 10101101 |
- 如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間:
- ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟體可以在UTF-8編碼下繼續工作。
電腦系統通用的字元編碼工作方式
記憶體:統一unicode編碼
硬碟、傳輸:轉換為utf-8
瀏覽網頁的時候,伺服器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器:
Python的字元串
相關函數
- ord()函數獲取字元的整數表示(單個字元)參數為要操作的單個字元,返回一個整數。
- chr()函數把編碼轉換為對應的字元(單個字元)
- encode()函數,將str字元串以指定的編碼方式(參數)變為bytes
'str'.encode(ascii/utf-8)返回bytes字元串
中文以ascii編碼會報錯
- decode()函數把從網路或磁碟上讀取的bytes以指定的編碼方式(參數)變為str
'bytes'.decode(ascii/utf-8)返回str字元串
bytes無法解碼會報錯,如果bytes中只有一小部分無效的位元組,可以傳入errors='ignore'忽略錯誤的位元組
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore') '中'
- len()函數,計算字元串包含字元個數
>>> len(b'ABC') 3 >>> len(b'\xe4\xb8\xad\xe6\x96\x87') 6 >>> len('中文'.encode('utf-8')) 6
在最新的Python 3版本中,字元串是以Unicode編碼的,也就是說,Python的字元串支持多語言
Python的字元串類型是str,如果要在網路上傳輸,或者保存到磁碟上,就需要把str變為bytes。
>>為了避免亂碼問題,應當始終堅持使用UTF-8編碼對str和bytes進行轉換<<
str和bytes的區別
- str一個字元對應若幹個位元組,但bytes的每個字元都只占用一個位元組。(將多位元組的字元分解為單位元組的多字元)
>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87'
在bytes中,無法顯示為ASCII字元的位元組,用\x##顯示。
- bytes字元帶首碼,帶引號
.py文件中含中文要用utf-8編碼
#!/usr/bin/env python3 # -*- coding: utf-8 -*-
第一行註釋是為了告訴Linux/OS X系統,這是一個Python可執行程式,Windows系統會忽略這個註釋;
第二行註釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。
>>編輯器用UTF-8 without BOM<<
字元串格式化問題
>>> 'Hello, %s' % 'world' 'Hello, world' >>> 'Hi, %s, you have $%d.' % ('Michael', 1000000) 'Hi, Michael, you have $1000000.'
%運算符
- 就是用來格式化字元串的。在字元串內部有幾個%?占位符,後面就跟幾個變數或者值,順序要對應好。如果只有一個%?,括弧可以省略。
- 轉義,用%%來表示一個%
>>> 'growth rate: %d %%' % 7 'growth rate: 7 %'
占位符 |
替換內容 |
%d |
整數 |
%f |
浮點數 |
%s |
字元串 |
%x |
十六進位整數 |
format()
另一種格式化字元串的方法是使用字元串的format()方法,它會用傳入的參數依次替換字元串內的占位符{0}、{1}……,不過這種方式寫起來比%要麻煩得多:
>>> 'Hello, {0}, 成績提升了 {1:.1f}%'.format('小明', 17.125) 'Hello, 小明, 成績提升了 17.1%'