Python中文編碼問題

中文編碼問題是用中文的程序員常常頭大的問題,在python下也是如此,那麼應該怎麼理解和解決python的編碼問題呢?前端

咱們要知道python內部使用的是unicode編碼,而外部卻要面對千奇百怪的各類編碼,好比做爲中國程序常常要面對的gbk,gb2312,utf8等,那這些編碼是怎麼轉換成內部的unicode呢?python

首先咱們先看一下源代碼文件中使用字符串的狀況。源代碼文件做爲文本文件就必然是以某種編碼形式存儲代碼的,python默認會認爲源代碼文件是asci編碼,好比說代碼中有一個變量賦值:程序員

s1=’a’ 
print s1函數

python認爲這個’a'就是一個asci編碼的字符。在僅僅使用英文字符的狀況下一切正常,可是若是用了中文,好比:編碼

s1=’哈’ 
print s1spa

這個代碼文件被執行時就會出錯,就是編碼出了問題。python默認將代碼文件內容看成asci編碼處理,但asci編碼中不存在中文,所以拋出異常。code

解決問題之道就是要讓python知道文件中使用的是什麼編碼形式,對於中文,能夠用的常見編碼有utf-8,gbk和gb2312等。只需在代碼文件的最前端添加以下:orm

# -*- 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的’哈’。

相關文章
相關標籤/搜索