Python3如何解決字符編碼問題詳解
編碼
因為計算機只能處理數(shù)字,如果要處理文本,就必須先把文本轉換為數(shù)字才能處理。最早的計算機在設計時采用8個比特(bit)作為一個字節(jié)(byte),所以,一個字節(jié)能表示的最大的整數(shù)就是255(二進制11111111=十進制255),如果要表示更大的整數(shù),就必須用更多的字節(jié)。比如兩個字節(jié)可以表示的最大整數(shù)是65535,4個字節(jié)可以表示的最大整數(shù)是4294967295。
由于計算機是美國人發(fā)明的,因此,最早只有127個字母被編碼到計算機里,也就是大小寫英文字母、數(shù)字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。
Python3字符編碼
Python3 最重要的一項改進之一就是解決了 Python2 中字符串與字符編碼遺留下來的這個大坑。
Python2 字符串設計上的一些缺陷:
- 使用 ASCII 碼作為默認編碼方式,對中文處理很不友好。
- 把字符串的牽強地分為 unicode 和 str 兩種類型,誤導開發(fā)者
當然這并不算 Bug,只要處理的時候多留心也可以避免這些坑。但在 Python3 兩個問題都很好的解決了。
首先,Python3 把系統(tǒng)默認編碼設置為 UTF-8
>>> import sys >>> sys.getdefaultencoding() 'utf-8' >>>
然后,文本字符和二進制數(shù)據(jù)區(qū)分得更清晰,分別用 str 和 bytes 表示。文本字符全部用 str 類型表示,str 能表示 Unicode 字符集中所有字符,而二進制字節(jié)數(shù)據(jù)用一種全新的數(shù)據(jù)類型,用 bytes 來表示。
str
>>> a = "a" >>> a 'a' >>> type(a) <class 'str'> >>> b = "禪" >>> b '禪' >>> type(b) <class 'str'>
bytes
Python3 中,在字符引號前加‘b',明確表示這是一個 bytes 類型的對象,實際上它就是一組二進制字節(jié)序列組成的數(shù)據(jù),bytes 類型可以是 ASCII范圍內的字符和其它十六進制形式的字符數(shù)據(jù),但不能用中文等非ASCII字符表示。
>>> c = b'a' >>> c b'a' >>> type(c) <class 'bytes'> >>> d = b'\xe7\xa6\x85' >>> d b'\xe7\xa6\x85' >>> type(d) <class 'bytes'> >>> >>> e = b'禪' File "<stdin>", line 1 SyntaxError: bytes can only contain ASCII literal characters.
bytes 類型提供的操作和 str 一樣,支持分片、索引、基本數(shù)值運算等操作。但是 str 與 bytes 類型的數(shù)據(jù)不能執(zhí)行 + 操作,盡管在py2中是可行的。
>>> b"a"+b"c" b'ac' >>> b"a"*2 b'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 字節(jié)與字符的對應關系
python2 | python3 | 表現(xiàn) | 轉換 | 作用 |
str | bytes | 字節(jié) | encode | 存儲 |
unicode | str | 字符 | decode | 顯示 |
encode 與 decode
str 與 bytes 之間的轉換可以用 encode 和從decode 方法。
encode 負責字符到字節(jié)的編碼轉換。默認使用 UTF-8 編碼準換。
>>> s = "Python之禪" >>> s.encode() b'Python\xe4\xb9\x8b\xe7\xa6\x85' >>> s.encode("gbk") b'Python\xd6\xae\xec\xf8'
decode 負責字節(jié)到字符的解碼轉換,通用使用 UTF-8 編碼格式進行轉換。
>>> b'Python\xe4\xb9\x8b\xe7\xa6\x85'.decode() 'Python之禪' >>> b'Python\xd6\xae\xec\xf8'.decode("gbk") 'Python之禪'
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關文章
Python如何利用pandas讀取csv數(shù)據(jù)并繪圖
這篇文章主要介紹了Python如何利用pandas讀取csv數(shù)據(jù)并繪圖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07python Web flask 視圖內容和模板實現(xiàn)代碼
這篇文章主要介紹了python Web flask 視圖內容和模板實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08mac安裝python3后使用pip和pip3的區(qū)別說明
這篇文章主要介紹了mac安裝python3后使用pip和pip3的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Python數(shù)據(jù)挖掘中常用的五種AutoEDA 工具總結
大家好,我們都知道在數(shù)據(jù)挖掘的過程中,數(shù)據(jù)探索性分析一直是非常耗時的一個環(huán)節(jié),但也是繞不開的一個環(huán)節(jié),本篇文章帶你盤點數(shù)據(jù)挖掘中常見的5種 AutoEDA 工具2021-11-11淺談Python xlwings 讀取Excel文件的正確姿勢
這篇文章主要介紹了淺談Python xlwings 讀取Excel文件的正確姿勢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02