Python3如何解決字符編碼問題詳解
編碼
因為計算機只能處理數(shù)字,如果要處理文本,就必須先把文本轉(zhuǎn)換為數(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 字符串設(shè)計上的一些缺陷:
- 使用 ASCII 碼作為默認(rèn)編碼方式,對中文處理很不友好。
- 把字符串的牽強地分為 unicode 和 str 兩種類型,誤導(dǎo)開發(fā)者
當(dāng)然這并不算 Bug,只要處理的時候多留心也可以避免這些坑。但在 Python3 兩個問題都很好的解決了。
首先,Python3 把系統(tǒng)默認(rèn)編碼設(shè)置為 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范圍內(nèi)的字符和其它十六進制形式的字符數(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é)與字符的對應(yīng)關(guān)系
| python2 | python3 | 表現(xiàn) | 轉(zhuǎn)換 | 作用 |
| str | bytes | 字節(jié) | encode | 存儲 |
| unicode | str | 字符 | decode | 顯示 |
encode 與 decode
str 與 bytes 之間的轉(zhuǎn)換可以用 encode 和從decode 方法。

encode 負(fù)責(zé)字符到字節(jié)的編碼轉(zhuǎn)換。默認(rèn)使用 UTF-8 編碼準(zhǔn)換。
>>> s = "Python之禪"
>>> s.encode()
b'Python\xe4\xb9\x8b\xe7\xa6\x85'
>>> s.encode("gbk")
b'Python\xd6\xae\xec\xf8'
decode 負(fù)責(zé)字節(jié)到字符的解碼轉(zhuǎn)換,通用使用 UTF-8 編碼格式進行轉(zhuǎn)換。
>>> b'Python\xe4\xb9\x8b\xe7\xa6\x85'.decode()
'Python之禪'
>>> b'Python\xd6\xae\xec\xf8'.decode("gbk")
'Python之禪'
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
pyqt5 實現(xiàn) 下拉菜單 + 打開文件的示例代碼
今天小編就為大家分享一篇pyqt5 實現(xiàn) 下拉菜單 + 打開文件的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python讀取CSV文件并進行數(shù)據(jù)可視化
這篇文章主要為大家詳細(xì)介紹了Python如何讀取CSV文件并進行數(shù)據(jù)可視化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
pytorch 如何使用batch訓(xùn)練lstm網(wǎng)絡(luò)
這篇文章主要介紹了pytorch 如何使用batch訓(xùn)練lstm網(wǎng)絡(luò)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
python threading和multiprocessing模塊基本用法實例分析
這篇文章主要介紹了python threading和multiprocessing模塊基本用法,結(jié)合實例形式詳細(xì)分析了Python中threading和multiprocessing模塊基本概念、功能、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-07-07
對python中的iter()函數(shù)與next()函數(shù)詳解
今天小編就為大家分享一篇對python中的iter()函數(shù)與next()函數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Pandas如何對帶有Multi-column(多列名稱)的數(shù)據(jù)排序并寫入Excel中
這篇文章主要介紹了Pandas如何對帶有Multi-column(多列名稱)的數(shù)據(jù)排序并寫入Excel中問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02

