記錄一下Python微信公眾號 中文編碼踩下的坑

最近幾天一直在新浪SAE服務器上用Python做微信公眾號開發(fā),在爬取網(wǎng)頁返回網(wǎng)頁數(shù)據(jù),當把提取的信息返回給用戶就出現(xiàn)“該公眾號提供的服務出現(xiàn)故障”,一直知道是Python中文編碼問題,前幾天一直在嘗試換各種編碼,一直未果,今天終于靜下心來補充編碼的各種知識,以后吸取教訓

參考資料:Python中文編碼問題

? ????????????????詳解 python2 中文編碼與處理



在Python的內部使用的是unicode編碼,而外部卻有千奇百怪的各種編碼,例如gbk,gb2312,utf-8等等,這些編碼到最后都會被轉換成內部的unicode

源代碼文件(英文字母,數(shù)字,常用符號)作為文本文件就必然是以某種編碼形式存儲代碼的,python默認會認為源代碼文件是asci編碼,比如說代碼中有一個變量賦值:

s1=’a’

print s1

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

s1=’哈’

print s1

這個代碼文件被執(zhí)行時就會出錯,就是編碼出了問題。python默認將代碼文件內容當作asci編碼處理,但asci編碼中不存在中文,因此拋出異常。

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

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

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

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

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

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

# -*- coding: gbk -*-

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

s1=u’哈’

print s1

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

這里的這個u表示將后面跟的字符串以unicode格式存儲。python會根據(jù)代碼第一行標稱的utf-8編碼識別代碼中的漢字’哈’,然后轉換成unicode對象。如果我們用type查看一下’哈’的數(shù)據(jù)類型type(‘哈’),會得到,而type(u’哈’),則會得到,也就是在字符前面加u就表明這是一個unicode對象,這個字會以unicode格式存在于內存中,而如果不加u,表明這僅僅是一個使用某種編碼的字符串,編碼格式取決于python對源碼文件編碼的識別,這里就是utf-8。

Python在向控制臺輸出unicode對象的時候會自動根據(jù)輸出環(huán)境的編碼進行轉換,但如果輸出的不是unicode對象而是普通字符串,則會直接按照字符串的編碼輸出字符串,從而出現(xiàn)上面的現(xiàn)象。

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

unicode類的構造函數(shù)接受一個字符串參數(shù)和一個編碼參數(shù),將字符串封裝為一個unicode,比如在這里,由于我們用的是utf-8編碼,所以unicode中的編碼參數(shù)使用’utf-8′將字符封裝為

unicode對象,然后正確輸出到控制臺:

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

print s1

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

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

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

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

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

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

s3現(xiàn)在又變回了utf-8的’哈’。



我遇到的坑就是當爬取到網(wǎng)頁的內容時,網(wǎng)頁數(shù)據(jù)采用的是gbk編碼,所以應當對網(wǎng)頁內容進行decode('gbk')編碼,把原網(wǎng)頁數(shù)據(jù)轉換成unicode的格式,當使用字符串查找中文時,應該在查找的關鍵詞前面加上u,例如? :

str_html = str_html.decode("gbk")? #對爬取到的網(wǎng)頁進行解碼

str_html = str_html.find(u"自動化") #字符串查找中文

功能其實在本地Python開發(fā)環(huán)境下面正常運行,但在服務器上面運行問題就出來了,在SAE服務上的Python對字符編碼異常敏感,當編碼不對應時,服務器SAE服務器便會不響應

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容