其實呢 長久以來一直被Python的編碼問題搞得亂七八糟, 反正解決的方法就是google然後encode, decode然後就會解決了. 所以也沒有很想去了解整個編碼的問題. 但這幾天也心血來潮, 想說是時候好好來釐清這個問題了.

我自己Goolge玩的心得是, 這個問題因為Python2 & Python3個關係而弄得更複雜了. 所以我自己的想法是我就只看Python3的編碼架構. 這樣會比較單純一點. 不然有時候你查的資料都不知道是Python2 or Python3你反而會更痛苦.

Background

計算機中的一切均為bytes組成, 所有的信息. 在你寫的程序中進出, 均由byte組成. 所以呢為了表示各種文字,ASCII碼因此產生了. (我想如果是Computer Science背景的對ASCII碼應該都不陌生). 當然ASCII可以解決英文所遇到的編碼問題. 但是如果有其他符號或是語言呢? 明顯的ASCII碼可能就不夠用了. 因此就有Unicode碼的產生.

在Python 3中,默認用UTF-8編碼解析源代碼. 且它有兩種字符串對象:str 和 bytes. 前者用來儲存 Unicode 字符集所能表達的字符,後者則儲存單字節所能表達的值. 簡單來說Unicode就是一個表. 這個表存著bytes對應到的字元符號. 什麼bytes對應到什麼符號通通可以藉由Unicode來查詢.(他也很好的包容了ASCII).

所以 str & bytes 之間的轉化關係如下,

  • Use .encode() to convert human text to bytes.
  • Use .decode() to convert bytes to human text.

那UTF-8只是Unicode下的其中一種編碼形式, 我是覺得不用特別去執著於這塊. 這樣想可能會單純一點. (在大部分的形況下用8bit來表示的字元數就夠用了, Python 3 & Linux基本上default就是utf-8了)

Reference