python如何解析包含不同編碼的字串

2021-07-24 17:43:03 字數 2530 閱讀 7316

問題的描述

有個同學從網上下了乙個資料報,是乙個dat結尾的檔案。讀取出來的時候發現是gb2312的編碼,但是當用gb2312去解碼的時候還是遇到了問題。似乎有個別的位元組解析不了。最後發現是字串中的乙個空格的編碼並不是gb2312。那麼問題來了,怎麼做到正確解析這樣的字串呢?

問題的發現

with

open('./news_sohusite_xml.dat', 'r') as f:

forline

in f:

#print chardet.detect(line) #chardet可以用來檢測字串的編碼

print line.decode("gb2312").encode("gbk")

上面的**中提到了可以用chardet這個庫中的detect函式來檢測字串的編碼,得到結果是gb2312的編碼方式。但是用gb2312去解碼的時候發現還是會卡住,提示錯誤是:

unicodedecodeerror: 'gb2312' codec can't decode bytes in position 24-25: illegal multibyte sequence
所以查了網上的有乙個解釋是:

有些特殊字元是gb18030中有的,但是是gbk中沒有的。 則用gbk去解碼所不支援的字元,會出錯。

所以,此種情況,可以嘗試用和當前編碼(gbk)所相容的但所包含字元更多的編碼(gb18030)去解碼,或許就可以了。

於是**改動如下:

with

open('./news_sohusite_xml.dat', 'r') as f:

forline

in f:

try:

print line.decode("gb2312").encode("gbk")

except:

print line.decode("gb18030").encode("gbk")

但是還是有錯誤:

unicodeencodeerror: 'gbk' codec can't encode character u'\ue40c' in position 12: illegal multibyte sequence
這很顯然,因為本身這個字元就不是gbk字符集中的,自然編碼會出錯,但是我用gb18030做編碼又列印不出來。於是我只能去檢視這個奇怪的字元是什麼?

上面三張圖,第一張是用gb2312編碼寫的「(句號)(下引號)(空格)(上引號)」在ultraedit中開啟後用十六進製制檢視的位元組碼,可以看到gb2312編碼的空格符對應的位元組碼是「0x20」,句號符對應的位元組碼是「a1a3」,下引號符對應「a1b1」,上引號符對應「a1b0」。

第二張圖是用utf8編碼寫的「好的(空格符)。」在ultraedit中開啟後用十六進製制檢視的位元組碼,可以看到utf8編碼的空格符對應的位元組碼還是「0x20」。(ff bf bf是編碼的頭,這裡不做解釋,「好」、「的」、「。」各佔三個字元,所以空格符對應「0x20」).

第三張圖是要上面要解碼的字串中擷取的一部分字串,從圖一種可以知道「a1a3」代表句號,「a1b1「代表下引號,「a1b0」代表上引號,那麼中間的」fda3「就根本不是空格符,也不是utf8編碼的空格符。雖然它用excel開啟後表現為類似空格的顯示。

那麼到這,問題基本明了了,就是這個類似空格的字元在作怪,不能用gb2312編碼解碼,但是可以用gb18030編碼解。上面的錯誤提示中看到,解出來的unicode是u』\ue40c』。

解決辦法

雖然不知道這個字元是什麼編碼,但是他並影響我們的工作,所以乾脆把它過濾掉,於是有以下的解決辦法:

def

filter

(unicode_list):

return

''.join([i for i in unicode_list.decode("gb18030") if i != u'\ue40c'])

with open('./news_sohusite_xml.dat', 'r') as f:

for line in f:

try:

print line.decode("gb2312").encode("gbk")

except:

print filter(line).encode("gbk")

後台如何解析html

string str 空白字型只是斜體斜體劃線 1111111加粗劃線樣式空白字型只是斜體斜體劃線 上面這個str字串,如何解析出類似於 文字 該文字塊有哪些屬性 i u b 文字樣式 public class fontstyle public void setisb boolean isb pub...

如何解析JSON物件

情景 解析同盾返回引數 獲取同盾返回物件 jsonobject jsonobject tdservice.invokequeryreport map2 解析json物件中key為result的物件引數 jsonobject jsonobject a jsonobject.getjsonobject ...

如何解析rdb檔案

相信大家也都或多或少的了解些redis,知道他是記憶體性nosql資料庫。那麼,疑問也就來了,這種記憶體型資料庫的資料在伺服器宕機後,資料還會恢復嗎?答案是會恢復的!因為這種記憶體型資料庫也存在它的持久化機制,下面是redis的rdb 持久化觸發條件 其含義如下 900秒內如果至少有1個key的值變...