1. 程式人生 > >深入理解Python的字元編碼utf-8 & unicode

深入理解Python的字元編碼utf-8 & unicode

參考:http://lukejin.iteye.com/blog/598303

一,通過例子理解字元編碼

在Python中有兩個和字元很相關的型別,一個是str型別,一個是unicode型別。

這兩種型別的物件都是sequece序列,其中str是位元組序列,而unicode是字元序列在2.x版本的python中,預設定義的字串是str型別的。

比如你這麼定義

點選(此處)摺疊或開啟

  1. # -*- coding:utf-8 -*-
  2. s=”中文”
  3. us=u”中文”

這樣的原始碼是儲存在原始碼檔案中的,其實檔案儲存在磁碟上的時候都是二進位制的位元組編碼 E4 B8 AD E6 96 87,只有一定的軟體比如檔案編輯器開啟檔案對這些文字的二進位制編碼進行正確的解碼後才能在軟體中顯示正確,被人們所看懂。

 那麼在執行的時候是什麼樣的狀態呢?

首先python的執行環境會檢測你的原始碼的編碼方式,utf-8且s的型別是str型別,即位元組序列,那麼我們需要將”中文”從原始碼檔案中按照utf-8讀取成位元組序列,那麼s在執行的時候就是找個位元組序列。其長度len(s)為6,因為utf-8中一箇中文需要3個位元組E4 B8 AD E6 96 87來表示而us是unicode字串,那麼在執行的時候,us是“中”和“國”這兩個字元的unicode字元\u4E2D \u6587,其長度是2

二.Python中和編碼相關的兩個函式

在Python中和編碼相關的兩個函式為decode和encode

在Java中你也會發現這兩個類似的方法。

你搜索一下網際網路你會發現關於這兩個方法的敘述會很多,很多都說的不是很準確。

其中encode()是將某個unicode字串按照一定的編碼方式編碼成位元組序列而decode()是一個反過程,將一個位元組序列按照一定的編碼方式解碼成unicode字串。

這個時候可能有人會問:那麼對於一個str型別(已經是位元組陣列)再應用decode是什麼概念呢??

其實str.encode(e) 是和 unicode(str).encode(e)是一樣的,python底層做的時候也是確實這麼做的。

python這麼實現主要是為了方式當某個物件不確定是str還是unicode型別的時候,那麼用encode函式總是不會出現錯誤。