Python3編碼問題

Python3最重要的進步之一就是解決了Python2中字符串與字符編碼的問題。
Python2字符串的缺陷如下:

  • 使用 ASCII 碼作爲默認編碼方式,對中文處理很不友好。
  • 把字符串的牽強地分爲 unicode 和 str 兩種類型,誤導開發者

而Python3則把系統默認編碼設置爲了 UTF-8

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

之後,文本字符和二進制數據分別用str和bytes表示。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'
>>> 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 一樣,支持分片、索引、基本數值運算等操作。但是 str 與 bytes 類型的數據不能執行 + 操作,儘管在py2中是可行的。會報錯:

TypeError: Can’t convert ‘bytes’ object to str implicitly

python2 與 python3 字節與字符的對應關係

Python2 Python3 表現 轉換 作用
str bytes 字節 encode 存儲
unicode str 字符 decode 顯示

encode 與 decode

str 與 bytes 之間的轉換可以用 encode 和從decode 方法。

encode : 字符str 到 字節bytes 的編碼轉換,默認用UTF-8編碼;

>>> s = 'Python大神'
>>> s.encode()
b'Python\xe5\xa4\xa7\xe7\xa5\x9e'
>>> s.encode('gbk')
b'Python\xb4\xf3\xc9\xf1'

decode : 字節bytes 到 字符str的轉換,通用使用 UTF-8 編碼格式進行轉換

>>> b'Python\xe5\xa4\xa7\xe7\xa5\x9e'.decode()
'Python大神'
>>> b'Python\xb4\xf3\xc9\xf1'.decode('gbk')
'Python大神'

原文出處:
http://python.jobbole.com/88277/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章