Python中文編碼問題

中文編碼問題是用中文的程序員經常頭大的問題,在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等。只需在代碼文件的最前端添加如下:

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

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

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

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

解決辦法一個是將源代碼的編碼也改成gbk,也就是代碼第一行改成:

# -*- coding: gbk -*-

另一種方法是保持源碼文件的utf-8不變,而是在』哈』前面加個u字,也就是:

s1=u』哈』 print s1

這樣就可以正確列印出』哈』字了。

這裡的這個u表示將後面跟的字元串以unicode格式存儲。python會根據代碼第一行標稱的utf-8編碼識別代碼中的漢字』哈』,然後轉換成unicode對象。如果我們用type查看一下』哈』的數據類

型type(『哈』),會得到<type 『str』>,而type(u』哈』),則會得到<type 『unicode』>,也就是在字元前面加u就表明這是一個unicode對象,這個字會以unicode格式存在於內存中,而如果不加u

,表明這僅僅是一個使用某種編碼的字元串,編碼格式取決於python對源碼文件編碼的識別,這裡就是utf-8。

Python在向控制台輸出unicode對象的時候會自動根據輸出環境的編碼進行轉換,但如果輸出的不是unicode對象而是普通字元串,則會直接按照字元串的編碼輸出字元串,從而出現上面的現

象。

使用unicode對象的話,除了這樣使用u標記,還可以使用unicode類以及字元串的encode和decode方法。

unicode類的構造函數接受一個字元串參數和一個編碼參數,將字元串封裝為一個unicode,比如在這裡,由於我們用的是utf-8編碼,所以unicode中的編碼參數使用』utf-8′將字元封裝為

unicode對象,然後正確輸出到控制台:

s1=unicode(『哈』, 『utf-8′) print s1

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

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

s2=』哈』.decode(『utf-8′)

這時,s2就是一個存儲了』哈』字的unicode對象,其實就和unicode(『哈』, 『utf-8′)以及u』哈』是相同的。

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

s3=unicode(『哈』, 『utf-8′).encode(『utf-8′)

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


推薦閱讀:

簡體中文
何為中文系 中文系何為
JS中頁面跳轉,傳值包含中文時亂碼解決方案
好好的中文字,被傻老外穿成了行走的表情包!
這本書中文讀者等了半個世紀 :《黑暗的閘門》中譯全本面世

TAG:Python | 編碼 | 問題 | 中文 |