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

Python 字符編碼處理總結

系統 1552 0

Python中經常遇到這樣那樣的字符編碼問題,尤其在處理網頁源碼時(特別是爬蟲中):

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

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

下面以漢字'哈'來解釋作示例解釋所有的問題,漢字“哈”的各種編碼如下:

1 UNICODE(UTF8-16) : 0xC854

2 UTF-8 : 0xE59388

3 GBK : 0xB9FE

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

不知道港臺的碼農同時處理簡體字繁體字是不是更郁悶(笑臉)

處理解決

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

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

例如:(注意是在windows下)

s = u'哈哈'

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

pirnt s_utf8

>>> 鍝堝搱

悲劇...

s_utf8這時實際上是'\xe5\x93\x88\xe5\x93\x88'

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

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

print s_gbk

>>> 哈哈 #正常了

因為print語句它的實現是將要輸出的內容傳 送了操作系統,操作系統會根據系統的編碼對輸入的字節流進行編碼,這就解釋了utf-8格式的字符串“哈哈”,輸出的是“鍝堝搱”,因為 '\xe5\x93\x88\xe5\x93\x88'用GB2312去解釋,其顯示的出來就“鍝堝搱”。

這里再強調一下,str記錄的是字節數組,只是某種編碼的存儲格式,至于輸出到文件或是打印出來是什么格式,完全取決其解碼的編碼將它解碼成什么樣子。

str和unicode對象的轉換,通過encode和decode實現,具體使用如下:再次強調windows下:

s = '哈哈'

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

>>> 鍝堝搱

反之亦然,有興趣可以嘗試其他轉換

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

import sys

reload(sys)

sys.setdefaultencoding('gbk')

后就可以轉換成功,為什么呢?

在python中str和unicode在編碼和解碼過程中,如果將一個str直接編碼成另一種編碼,會先把str解碼成unicode,采用默認編碼,一般默認編碼是anscii,所以在上面示例代碼中第一次轉換的時候會出錯,

當設定當前默認編碼為'gbk'后,就不會出錯了。至于reload(sys)是因為Python2.5 初始化后會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入。一般不推薦這樣使用。本來reload都是應該避免使用的函數。

對于操作不同文件的編碼格式的文件,也會遇到這樣的問題

建立一個文件test.txt,文件格式用ANSI,內容為:

abc中文

然后用python來讀取

# coding=gbk

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

結果:abc中文

把文件格式改成UTF-8:

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

# coding=gbk

import codecs

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

結果:abc中文

上面的test.txt我是用Editplus來編輯的,但當我用Windows自帶的記事本編輯并存成UTF-8格式時,

運行時報錯:

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

原來,某些軟件,如notepad,在保存一個以UTF-8編碼的文件時,

會在文件開始的地方插入三個不可見的字符(0xEF 0xBB 0xBF,即BOM)。

因此我們在讀取時需要自己去掉這些字符,python中的codecs module定義了這個常量:

# coding=gbk

import codecs

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

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

data = data[3:]

print data.decode("utf-8")

結果:abc中文

最后,有些時候編碼搞對了,但是遇到了非法字符,比如產生字符串的來源發生錯誤,引入了錯誤值等,這時再次遇到異常

例如:全角空格往往有多種不同的實現方式,比如\xa3\xa0,或者\xa4\x57,

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

真正的全角空格是\xa1\xa1,因此在轉碼的過程中出現了異常。

而之前在處理新浪微博數據時,遇到了非法空格問題導致無法正確解析數據。

解決辦法:

將獲取的字符串strTxt做decode時,指明ignore,會忽略非法字符,

當然對于gbk等編碼,處理同樣問題的方法是類似的

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

return strTest

默認的參數就是strict,代表遇到非法字符時拋出異常;

如果設置為ignore,則會忽略非法字符;

如果設置為replace,則會用?號取代非法字符;

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本亚洲黄色 | 亚洲成人免费网站 | 四虎国产精品永久地址99新强 | www.好吊妞| 久久欧美精品欧美九久欧美 | 亚洲精品 国产 日韩 | 欧美成人香蕉网在线观看 | 国产一区二区高清 | 成人国产片免费 | 性做久久久久久久免费看 | www4虎| 久久久91精品国产一区二区三区 | 欧美三级做爰在线 | 久久国产精品免费看 | 国产精自产拍久久久久久蜜 | 不卡影院网 | 国产精品视频分类一区 | 国产成人一区 | 国产综合色在线视频区色吧图片 | 国产成人啪精品视频免费网 | 99这里有精品视频 | 国内精品自在自线香蕉 | 久久996国产精品免费 | 国产精品久久自在自2021 | 97在线观看完整免费 | 亚洲精品福利视频 | 成人免费视频在线观看 | 国产在线精品观看一区 | 久草在线在线精品观看 | 国产精品亚洲玖玖玖在线靠爱 | 国产亚洲亚洲精品777 | 伊人久久婷婷丁香六月综合基地 | 夜色福利视频 | 久青草视频 | 国产自愉怕一区二区三区 | 精品久久在线 | 欧美爱爱片 | 欧美激情在线视频播放 | 色www精品视频在线观看 | 国产一在线精品一区在线观看 | www.日韩视频|