我從Python字元串的編碼和解碼的角度來說說這個問題。字元編碼對于了解非英語字元的有關内容非常有幫助。
從本質上來說,編碼和解碼就是Python中str和bytes這兩種字元串類型之間的互相轉換。
str包含一個encode方法,使用特定編碼将該字元串其轉換為一個bytes,這稱之為編碼。bytes類包含了一個decode方法,也接受一個編碼作為單個必要參數,并傳回一個str,這稱之為解碼。這種轉換操作是顯式的操作,且必須根據資料被編碼時采用的編碼類型進行解碼。
首先說說編碼,即将unicode的str文本字元串轉換為bytes的位元組字元串,可以顯式的傳入指定編碼(一般來說采用utf-8編碼),或使用平台的預設編碼。
s = 'π排球の'
b1 = s.encode('utf-8')
b2 = s.encode()
print(b1)
print(b2)
b'\xcf\x80\xe6\x8e\x92\xe7\x90\x83\xe3\x81\xae'
b'\xcf\x80\xe6\x8e\x92\xe7\x90\x83\xe3\x81\xae'
那麼我們看看,在不寫編碼的時候,平台預設的編碼方式到底是什麼
import sys
print(sys.platform)
print(sys.getdefaultencoding())
win32
utf-8
可以看出我這個平台預設選擇的就是utf-8編碼方式。
那對應的,再來談談decode解碼方法
将bytes類型字元串轉換成str類型的unicode文本字元串也是一樣,要麼指定編碼參數,要麼使用平台的預設參數。這個例子中,我們要操作的位元組字元串b是通過utf-8編碼方式對文本字元串'π排球の'編碼而形成的。
b = b'\xe6\x8e\x92\xe7\x90\x83'
s1 = b.decode(encoding='utf-8')
s2 = b.decode()
s3 = b.decode(encoding='latin-1')
print(s1)
print(s2)
print(s3)
排球
排球
排çƒ
從結果中我們可以看出,我們利用utf-8對位元組字元串進行解碼,可以獲得正确的漢字字元串。而值得注意的是,最後一行代碼想通過latin-1解碼位元組字元串,由于位元組字元串是通過utf-8編碼形成,是以這樣解碼形成得到的隻能是亂碼。
希望從這個角度,有助于大家對于擷取中文有了更好的了解。
更系統、更深入的探讨可進入我們的專欄《Python資料科學之路》醬油哥:來吧,一起踏上Python資料科學之路zhuanlan.zhihu.com

本專欄仿照美劇的劇集編排方式和整體邏輯架構進行組織,目前策劃共分為七季:
第一季:Python程式設計語言核心基礎。
第二季:Python資料分析基本工具。
第三季:機器學習線性代數核心-Python描述。
第四季:利用python進行時間序列分析。
第五季:機器學習機率統計核心-Python描述。
第六季:機器學習典型算法專題。
第七季:實戰熱點深度應用。
讓我們一步一個台階,共同踏上Python資料科學之旅。