流暢的 Python – 3. 文字與位元組

Xinnay發表於2019-02-16

對於字串,我們接觸得挺多的。而編碼問題,也不時令人頭疼的。

由於一開始接觸的就是 Python3,所以一些在 Python2 上的編碼上的坑我沒遇到,甚至在 Python3 上都很少遇到編碼問題,因為 Python3 預設的編碼是 utf-8,而之前又從 Windows 轉到了 Arch,編碼問題已經很少遇到了。

不過還是要重新認識一下字元與位元組。位元組可由指定字串編碼得到,是不可變型別。使用下標獲取位元組的值時,返回的是整數。這個是沒想到的。很多適用於 str 物件的方法也適用於 bytes 物件。

struct 模組提供了一些函式可把位元組序列與其他不同的型別互相轉換。memoryview 用於共享記憶體,前面剛碰到過。

除了 utf-8 編碼,Python 還內建了許多其他的編碼器。不同編碼器編碼的相同的字元,最終的位元組大小可能會不同。

對於 UnicodeEncodeError 和 UnicodeDecodeError,是由於對應編碼不能處理字串 / 位元組導致的。而 SyntaxError,則是由於沒有宣告編碼,平臺編碼不能處理對應模組的 .py 檔案。

在處理檔案檔案時,建議是指定編碼開啟或寫入,不然跨作業系統執行指令碼可能會出錯。

之後,講到了規範化 Unicode 字串。之前是一直沒想過這樣的問題,一些特殊字元,該怎麼搜尋?這裡給出了答案,那就是使用 unicodedata.normalize 函式提供的

Unicode 規範化。它有四個引數:NFCNFDNFKCNFKD

 NFC(Normalization Form C)使用最少的碼位構成等價的字串,而 NFD 把組合字元分解成基字元和單獨的組合字元。

在另外兩個規範化形式(NFKC 和 NFKD)的首字母縮略詞中,字母 K 表示“compatibility”(相容性)。

一般使用 NFC 儲存字串。後兩種轉換會有格式損失,但在搜尋中卻很有用。

還有就是大小寫摺疊,不僅僅是忽略大小寫,而且把其他一些符號改變。書上還介紹了一規範化——把變音符號去掉。

對 Unicode 字元的排序,可使用 key 關鍵字引數獲得我們想要的排序結果。之後就是 Unicode 資料庫,裡面儲存了各種關於 Unicode 的訊息。

最後是雙模 API,同一函式能接受字串和位元組進行操作。

書上很多問題都沒怎麼遇到,也沒想到會這麼複雜,不過相信以後會接觸到的。慢慢消化吧。

相關文章