亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python 字符編碼處理總結(jié)

系統(tǒng) 1758 0

Python中經(jīng)常遇到這樣那樣的字符編碼問(wèn)題,尤其在處理網(wǎng)頁(yè)源碼時(shí)(特別是爬蟲(chóng)中):

UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 12-15: illegal multibyte...

每次看到上面這段文字的時(shí)候,感覺(jué)整個(gè)世界都昏暗了,然后就只能各種搜索找資料,過(guò)后就忘了。下次遇到時(shí)就讓世界再昏暗一次。為了徹底解決這個(gè)攔路虎,今天咱們就好好的來(lái)嘮嗑嘮嗑。

下面以漢字'哈'來(lái)解釋作示例解釋所有的問(wèn)題,漢字“哈”的各種編碼如下:

1 UNICODE(UTF8-16) : 0xC854

2 UTF-8 : 0xE59388

3 GBK : 0xB9FE

除此之外還有如gb2312, big5等。例如一些含有繁體字的頁(yè)面,比如www.google.com.hk首頁(yè)中用的就是big5碼,

不知道港臺(tái)的碼農(nóng)同時(shí)處理簡(jiǎn)體字繁體字是不是更郁悶(笑臉)

處理解決

首先,在python中提到unicode,一般指的是unicode對(duì)象,例如'哈哈'的unicode對(duì)象為u'\u54c8\u54c8'

而str是一個(gè)字節(jié)數(shù)組,這個(gè)字節(jié)數(shù)組表示的是對(duì)unicode對(duì)象編碼后(如utf-8、gbk、cp936、GB2312)的存儲(chǔ)的格式,這里它僅是一個(gè)字節(jié)流,沒(méi)有其它的含義,如果你想使這個(gè)字節(jié)流顯示的內(nèi)容有意義,就必須用正確的編碼格式,解碼顯示。

例如:(注意是在windows下)

s = u'哈哈'

s_utf8 = s.encode('utf-8')

pirnt s_utf8

>>> 鍝堝搱

悲劇...

s_utf8這時(shí)實(shí)際上是'\xe5\x93\x88\xe5\x93\x88'

而下面的代碼才可以正常顯示:

s_gdb = s.encode('gbk') # s_gdk 這時(shí)是'\xb9\xfe\xb9\xfe'

print s_gbk

>>> 哈哈 #正常了

因?yàn)閜rint語(yǔ)句它的實(shí)現(xiàn)是將要輸出的內(nèi)容傳 送了操作系統(tǒng),操作系統(tǒng)會(huì)根據(jù)系統(tǒng)的編碼對(duì)輸入的字節(jié)流進(jìn)行編碼,這就解釋了utf-8格式的字符串“哈哈”,輸出的是“鍝堝搱”,因?yàn)?'\xe5\x93\x88\xe5\x93\x88'用GB2312去解釋?zhuān)滹@示的出來(lái)就“鍝堝搱”。

這里再?gòu)?qiáng)調(diào)一下,str記錄的是字節(jié)數(shù)組,只是某種編碼的存儲(chǔ)格式,至于輸出到文件或是打印出來(lái)是什么格式,完全取決其解碼的編碼將它解碼成什么樣子。

str和unicode對(duì)象的轉(zhuǎn)換,通過(guò)encode和decode實(shí)現(xiàn),具體使用如下:再次強(qiáng)調(diào)windows下:

s = '哈哈'

print s.decode('gbk').encode('utf-8')

>>> 鍝堝搱

反之亦然,有興趣可以嘗試其他轉(zhuǎn)換

有時(shí)當(dāng)我們遇到把s(gbk字符串)直接編碼成utf-8的時(shí)候,將拋出異常,但是通過(guò)調(diào)用如下代碼:

import sys

reload(sys)

sys.setdefaultencoding('gbk')

后就可以轉(zhuǎn)換成功,為什么呢?

在python中str和unicode在編碼和解碼過(guò)程中,如果將一個(gè)str直接編碼成另一種編碼,會(huì)先把str解碼成unicode,采用默認(rèn)編碼,一般默認(rèn)編碼是anscii,所以在上面示例代碼中第一次轉(zhuǎn)換的時(shí)候會(huì)出錯(cuò),

當(dāng)設(shè)定當(dāng)前默認(rèn)編碼為'gbk'后,就不會(huì)出錯(cuò)了。至于reload(sys)是因?yàn)镻ython2.5 初始化后會(huì)刪除 sys.setdefaultencoding 這個(gè)方法,我們需要重新載入。一般不推薦這樣使用。本來(lái)reload都是應(yīng)該避免使用的函數(shù)。

對(duì)于操作不同文件的編碼格式的文件,也會(huì)遇到這樣的問(wèn)題

建立一個(gè)文件test.txt,文件格式用ANSI,內(nèi)容為:

abc中文

然后用python來(lái)讀取

# coding=gbk

print open("Test.txt").read()

結(jié)果:abc中文

把文件格式改成UTF-8:

結(jié)果:abc涓枃,顯然,這里需要解碼:

# coding=gbk

import codecs

print open("Test.txt").read().decode("utf-8")

結(jié)果:abc中文

上面的test.txt我是用Editplus來(lái)編輯的,但當(dāng)我用Windows自帶的記事本編輯并存成UTF-8格式時(shí),

運(yùn)行時(shí)報(bào)錯(cuò):

Traceback (most recent call last):

File "ChineseTest.py", line 3, in

print open("Test.txt").read().decode("utf-8")

UnicodeEncodeError: 'gbk' codec can't encode character u'\ufeff' in position 0: illegal multibyte sequence

原來(lái),某些軟件,如notepad,在保存一個(gè)以UTF-8編碼的文件時(shí),

會(huì)在文件開(kāi)始的地方插入三個(gè)不可見(jiàn)的字符(0xEF 0xBB 0xBF,即BOM)。

因此我們?cè)谧x取時(shí)需要自己去掉這些字符,python中的codecs module定義了這個(gè)常量:

# coding=gbk

import codecs

data = open("Test.txt").read()

if data[:3] == codecs.BOM_UTF8:

data = data[3:]

print data.decode("utf-8")

結(jié)果:abc中文

最后,有些時(shí)候編碼搞對(duì)了,但是遇到了非法字符,比如產(chǎn)生字符串的來(lái)源發(fā)生錯(cuò)誤,引入了錯(cuò)誤值等,這時(shí)再次遇到異常

例如:全角空格往往有多種不同的實(shí)現(xiàn)方式,比如\xa3\xa0,或者\(yùn)xa4\x57,

這些字符,看起來(lái)都是全角空格,但它們并不是“合法”的全角空格

真正的全角空格是\xa1\xa1,因此在轉(zhuǎn)碼的過(guò)程中出現(xiàn)了異常。

而之前在處理新浪微博數(shù)據(jù)時(shí),遇到了非法空格問(wèn)題導(dǎo)致無(wú)法正確解析數(shù)據(jù)。

解決辦法:

將獲取的字符串strTxt做decode時(shí),指明ignore,會(huì)忽略非法字符,

當(dāng)然對(duì)于gbk等編碼,處理同樣問(wèn)題的方法是類(lèi)似的

strTest = strTxt.decode('utf-8', 'ignore')

return strTest

默認(rèn)的參數(shù)就是strict,代表遇到非法字符時(shí)拋出異常;

如果設(shè)置為ignore,則會(huì)忽略非法字符;

如果設(shè)置為replace,則會(huì)用?號(hào)取代非法字符;

如果設(shè)置為xmlcharrefreplace,則使用XML的字符引用。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日本亚洲欧美国产日韩ay高清 | 中文字幕在线免费观看视频 | 色偷偷91久久综合噜噜噜 | 一级影院 | 香蕉久久夜色精品国产2020 | 国产在线观看一区二区三区 | 欧美一级黄色毛片 | 精品国产影院 | 亚洲a在线播放 | 久久欧美精品欧美九久欧美 | 亚洲国产伦理 | 亚洲欧洲日产国码二区首页 | 国产精品美女www爽爽爽视频 | 欧美精品国产一区二区 | 色狠狠色综合吹潮 | 久久网在线 | 91中文字幕视频 | 91亚洲精品国产自在现线 | 成人国产精品免费视频不卡 | 99精品免费视频 | 久久大香伊蕉在人线国产昨爱 | 成人影院www在线观看 | 日日操夜夜操狠狠操 | 99爱视频 | 男女www| 一级作爱视频免费观看 | 国产精品一区二区久久精品 | 九热视频在线观看 | 日本黄色不卡视频 | 亚洲一在线 | 久久精品国产麻豆不卡 | 免费的毛片视频 | 免费一区二区三区四区五区 | 中文字幕国产 | 久久综合狠狠综合久久97色 | 中文字幕欧美在线观看 | 一级黄色录像免费观看 | 亚洲欧美在线综合一区二区三区 | 国产91在线 | 亚洲 | 男女免费在线视频 | 免费又爽又黄禁片视频在线播放 |