2015年12月20日 星期日

Python 2.x/3.x 中的 str、bytes 以及 unicode

前言


在初學 Python 時,總是對於Python對於文字編碼的處理,感到疑惑!尤其版本的差異造成認知上的混淆,前一陣子,因為我有中文文字處理的相關需求,發現對於編碼概念以及處理的重要性,浪費了不少時間,故以此篇記錄提醒自己。


Python2.x/3.x 字元序列型別差異

在 python3.x 裡,有兩種型態來表示字元序列:
  1. bytes:原始的八位元值(二進位資料、常見的編碼為 UTF-8)
  2. str:即unicode
而 python2.x 裡,則是另外兩種型態來表示字元序列:
  1. str:原始的八位元值(二進位資料、常見的編碼為 UTF-8)
  2. unicode


編碼(encoding)與解碼(decoding)概念

在 python2.x 中,通常會在檔案的開頭給定 # -*- coding: utf-8 -*- ,因為 python2.x 中會以ASCII 編碼來解讀程式原始碼,所以不給的話,我們打中文會出現錯誤,然而在 python3.x 中則預設原始碼必須是 UTF-8 編碼。

假使我們要將 python3.x 的 str 以及 python2.x 的 unicode 進行二進位資料轉換,必須使用 encode,相反要將二進位資料轉換為 unicode 則需使用 decode。

在一些書籍以及網站上,通常會建議程式的核心應以 unicode 型別,並且不對字元的編碼格式進行預設,因為如此一來才能讓我們接受各種不同的文字編碼,但在輸出時必須確保我們是以 UTF-8 編碼(通常)。

在 python 2.x 我們可以撰寫 helper function 來確保字串型態,如下:

helper function


Python3.x 寫入與讀取檔案可能遇到之問題

因為在 python3.x 版,對於 open 函式有encoding為 utf-8 的預設,因此若要解決 TypeError,請務必使用 rb、wb 等二進位模式開啟檔案,而在 python 2.x 雖然本身已是二進位預設開啟,但若同樣使用 rb、wb,可以減少對於版本差異而發生的錯誤。


進階參考

沒有留言:

張貼留言