Scrapy使用过程中的中文乱码问题

在使用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的区别


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值