text = response.text.encode("ISO 8859-1").decode("gbk")
或者
text = response.text.encode("ISO 8859-1").decode("utf-8")
print(text)
在使用scrapy抓取微博的話題時,抓取到了一個中文字段(用變量a表示),無論使用何種編碼方式都無法正確顯示,如下所示:
查看a的編碼后,確認是unicode編碼,具體值如下所示:
直接print a結果為亂碼,將a encode之后,結果仍未亂碼:
並且我們發現a.encode('utf-8')之后,字節序列的值都發生了變化,直觀上感覺應該不能回復成原來的中文了。經過這次嘗試,我們猜想到,a的unicode編碼
應該是a所代表的中文字段經過編碼之后的字節序列,那么我們首先將a的unicode序列編碼成str類型的變量b(采用ISO 8859-1,至於為什么采用ISO 8859-1后面再介紹),並且保持序列的字節值不變,如下所示:
觀察可知,var b和var a只是編碼類型不一樣,內部的字節的值保持一致。這時候var b就是這個中文字段的utf-8編碼了,直接print 即可。
為了驗證var b是不是中文--#反對校園暴力#的utf-8編碼,作如下嘗試:
結果表明,var b正是中文字段的utf-8的編碼字節序列,只不過scrapy在抓取的時候,其變成了unicode編碼的序列。但是為什么需要用iso 8859-1將其編碼成str呢?
關於Unicode、UTF-8 和 ISO8859-1編碼的介紹可以參考該鏈接 http://blog.sina.com.cn/s/blog_673c81990100t1lc.html
iso8859-1編碼屬於單字節編碼,應用於英文系列,和ascii編碼相似,因此使用iso8859-1編碼可以把unicode編碼
編碼為str-->,
然后就可以恢復出中文了。
附:編碼小結:
1、ISO8859-1:單字節定長編碼,應用於英文系列,無法表示中文,和ascii編碼相似。
2、GB2312/GBK:漢字國標碼,雙字節非定長編碼,兼容ISO8859-1,英文字母和ISO8859-1一致。GBK編碼能夠表示繁體和簡體字,GB2312只能表示簡體字,GBK兼容GB2312.
3、unicode:最統一的編碼,定長雙字節編碼(也有四字節編碼,python是雙字節),包括英文字母在內,可以表示所有語言的字符,所以不兼容ISO8859-1。對於英文系列而言,unicode編碼只是在ISO8859-1編碼前面增加了一個字節0。定長編碼便於計算機處理,而且unicode又能表示表示所有字符,所有很多軟件和程序員都采用unicode編碼。
3、UTF:考慮到unicode不兼容ISO8859-1,而且占用更多空間(英文也采用雙字節),不便於傳輸和存儲,故而產生了utf編碼,utf編碼兼容iso8859-1編碼,並且也可以表示所有語言的字符。utf編碼長度是1-6個字節不等,且自帶編碼校驗功能,英文字母是單字節,中文使用三個字節。
utf節省空間是相對於unicode而言的,如果已知為中文字符,則使用GBK/GB2312是最節省空間的。即使對於漢字網頁utf編碼也比unicode編碼更節省空間,因為網頁中也包含了很多英文。
Q:UTF-8 和UTF-16的區別
---------------------
作者:scriptin
來源:CSDN
原文:https://blog.csdn.net/myheadfirst/article/details/46635197
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!