1. 程式人生 > >Pyhon 中文編碼問題(字串前加‘U’)

Pyhon 中文編碼問題(字串前加‘U’)

中文編碼問題是用中文的程式設計師經常頭大的問題,在python下也是如此,那麼應該怎麼理解和解決python的編碼問題呢?

我們要知道python內部使用的是unicode編碼,而外部卻要面對千奇百怪的各種編碼,比如作為中國程式經常要面對的gbk,gb2312,utf8等,那這些編碼是怎麼轉換成內部的unicode呢?

首先我們先看一下原始碼檔案中使用字串的情況。原始碼檔案作為文字檔案就必然是以某種編碼形式儲存程式碼的,python預設會認為原始碼檔案是asci編碼,比如說程式碼中有一個變數賦值:

s1=’a’ 
print s1

 

python認為這個’a’就是一個asci編碼的字元。在僅僅使用英文字元的情況下一切正常,但是如果用了中文,比如:

s1=’哈’ 
print s1

 

這個程式碼檔案被執行時就會出錯,就是編碼出了問題。python預設將程式碼檔案內容當作asci編碼處理,但asci編碼中不存在中文,因此丟擲異常。

解決問題之道就是要讓python知道檔案中使用的是什麼編碼形式,對於中文,可以用的常見編碼有utf-8,gbk和gb2312等。只需在程式碼檔案的最前端新增如下:

1 # -*- coding: utf-8 -*-

 

 

這就是告知python我這個檔案裡的文字是用utf-8編碼的,這樣,python就會依照utf-8的編碼形式解讀其中的字元,然後轉換成unicode編碼內部處理使用。

不過,如果你在Windows控制檯下執行此程式碼的話,雖然程式是執行了,但螢幕上打印出的卻不是哈字。這是由於python編碼與控制檯編碼的不一致造成的。Windows下控制檯中的編碼使用的

是gbk,而在程式碼中使用的utf-8,python按照utf-8編碼列印到gbk編碼的控制檯下自然就會不一致而不能打印出正確的漢字。

解決辦法一個是將原始碼的編碼也改成gbk,也就是程式碼第一行改成:

1 # -*- coding: gbk -*-

 

另一種方法是保持原始碼檔案的utf-8不變,而是在’哈’前面加個u字,也就是:

1 s1=u’哈’ 
2 print
s1

 

這樣就可以正確打印出’哈’字了。

這裡的這個u表示將後面跟的字串以unicode格式儲存。python會根據程式碼第一行標稱的utf-8編碼識別程式碼中的漢字’哈’,然後轉換成unicode物件。如果我們用type檢視一下’哈’的資料型別type(‘哈’),會得到

1 s1=unicode(‘哈’, ‘utf-8′) 
2 print s1

 

另外,用decode函式也可以將一個普通字串轉換為unicode物件。很多人都搞不明白python字串的decode和encode函式都是什麼意思。這裡簡要說明一下。

decode是將普通字串按照引數中的編碼格式進行解析,然後生成對應的unicode物件,比如在這裡我們程式碼用的是utf-8,那麼把一個字串轉換為unicode就是如下形式:

1 s2=’哈’.decode(‘utf-8′)

 

這時,s2就是一個儲存了’哈’字的unicode物件,其實就和unicode(‘哈’, ‘utf-8′)以及u’哈’是相同的。

那麼encode正好就是相反的功能,是將一個unicode物件轉換為引數中編碼格式的普通字元,比如下面程式碼:

1 s3=unicode(‘哈’, ‘utf-8′).encode(‘utf-8′)

 

s3現在又變回了utf-8的’哈’。