首頁  >  文章  >  後端開發  >  Python3解決棘手的字符編碼問題詳解

Python3解決棘手的字符編碼問題詳解

PHPz
PHPz原創
2017-04-02 13:23:491459瀏覽

Python3 最重要的一項改進之一就是解決了 Python2 中字串與字元編碼遺留下來的這個大坑。 Python 編碼為什麼那麼蛋會痛?已經介紹過 Python2 字串設計上的一些缺陷: 
- 使用 ASCII 碼作為預設編碼方式,對中文處理很不友善。 
- 把字串牽強地分成 unicode 和 str 兩種類型,誤導開發者

#當然這並不算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 &#39;str&#39;>
>>> b = "禅"
>>> b
&#39;禅&#39;
>>> type(b)
<class &#39;str&#39;>

bytes

Python3 中,在字元引號前加'b',明確表示這是一個bytes 類型的物件,實際上它就是一組二進位位元組序列組成的數據,bytes 類型可以是ASCII範圍內的字元和其它十六進位形式的字元數據,但不能用中文等非ASCII字元表示。

>>> c = b&#39;a&#39;>>> c
b&#39;a&#39;>>> type(c)
<class &#39;bytes&#39;>

>>> d = b&#39;\xe7\xa6\x85&#39;>>> d
b&#39;\xe7\xa6\x85&#39;>>> type(d)
<class &#39;bytes&#39;>
>>>

>>> e = b&#39;禅&#39;
  File "<stdin>", line 1SyntaxError: bytes can only contain ASCII literal characters.

bytes類型提供的運算和str一樣,支援分片、索引、基本數值運算等運算。但是str與bytes類型的資料不能執行+操作,儘管在py2中是可行的。

>>> b"a"+b"c"
b&#39;ac&#39;
>>> b"a"*2
b&#39;aa&#39;
>>> b"abcdef\xd6"[1:]
b&#39;bcdef\xd6&#39;
>>> b"abcdef\xd6"[-1]
214
>>> b"a" + "b"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can&#39;t concat bytes to str

encode 與 decode

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

encode負責字元到位元組的編碼轉換。預設使用UTF-8編碼準換。

>>> s = "Python之禅"
>>> s.encode()
b&#39;Python\xe4\xb9\x8b\xe7\xa6\x85&#39;
>>> s.encode("gbk")
b&#39;Python\xd6\xae\xec\xf8&#39;

decode負責位元組到字元的解碼轉換,通用使用UTF-8編碼格式進行轉換。

>>> b&#39;Python\xe4\xb9\x8b\xe7\xa6\x85&#39;.decode()
&#39;Python之禅&#39;
>>> b&#39;Python\xd6\xae\xec\xf8&#39;.decode("gbk")
&#39;Python之禅&#39;

以上是Python3解決棘手的字符編碼問題詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn