編碼
因為計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。最早的計算機在設計時采用8個比特(bit)作為一個字節(byte),所以,一個字節能表示的最大的整數就是255(二進制11111111=十進制255),如果要表示更大的整數,就必須用更多的字節。比如兩個字節可以表示的最大整數是65535,4個字節可以表示的最大整數是4294967295。
由于計算機是美國人發明的,因此,最早只有127個字母被編碼到計算機里,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。
Python3字符編碼
Python3 最重要的一項改進之一就是解決了 Python2 中字符串與字符編碼遺留下來的這個大坑。
Python2 字符串設計上的一些缺陷:
當然這并不算 Bug,只要處理的時候多留心也可以避免這些坑。但在 Python3 兩個問題都很好的解決了。
首先,Python3 把系統默認編碼設置為 UTF-8
>>> import sys>>> sys.getdefaultencoding()'utf-8'>>>
然后,文本字符和二進制數據區分得更清晰,分別用 str 和 bytes 表示。文本字符全部用 str 類型表示,str 能表示 Unicode 字符集中所有字符,而二進制字節數據用一種全新的數據類型,用 bytes 來表示。
str
>>> a = "a">>> a'a'>>> type(a)<class 'str'>>>> b = "禪">>> b'禪'>>> type(b)<class 'str'>
bytes
Python3 中,在字符引號前加‘b',明確表示這是一個 bytes 類型的對象,實際上它就是一組二進制字節序列組成的數據,bytes 類型可以是 ASCII范圍內的字符和其它十六進制形式的字符數據,但不能用中文等非ASCII字符表示。
>>> c = b'a'>>> cb'a'>>> type(c)<class 'bytes'>>>> d = b'/xe7/xa6/x85'>>> db'/xe7/xa6/x85'>>> type(d)<class 'bytes'>>>>>>> e = b'禪' File "<stdin>", line 1SyntaxError: bytes can only contain ASCII literal characters.
bytes 類型提供的操作和 str 一樣,支持分片、索引、基本數值運算等操作。但是 str 與 bytes 類型的數據不能執行 + 操作,盡管在py2中是可行的。
>>> b"a"+b"c"b'ac'>>> b"a"*2b'aa'>>> b"abcdef/xd6"[1:]b'bcdef/xd6'>>> b"abcdef/xd6"[-1]214>>> b"a" + "b"Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: can't concat bytes to str
python2 與 python3 字節與字符的對應關系
| python2 | python3 | 表現 | 轉換 | 作用 |
| str | bytes | 字節 | encode | 存儲 |
| unicode | str | 字符 | decode | 顯示 |
encode 與 decode
str 與 bytes 之間的轉換可以用 encode 和從decode 方法。

encode 負責字符到字節的編碼轉換。默認使用 UTF-8 編碼準換。
>>> s = "Python之禪">>> s.encode()b'Python/xe4/xb9/x8b/xe7/xa6/x85'>>> s.encode("gbk")b'Python/xd6/xae/xec/xf8'decode 負責字節到字符的解碼轉換,通用使用 UTF-8 編碼格式進行轉換。
>>> b'Python/xe4/xb9/x8b/xe7/xa6/x85'.decode()'Python之禪'>>> b'Python/xd6/xae/xec/xf8'.decode("gbk")'Python之禪'總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
新聞熱點
疑難解答
圖片精選