python 2.7编码问题理解
写爬虫的时候遇到了字符编码的问题,详细了解一下
相关概念
1.什么是字符编码
字符是人类能够识别的符号,这些符号要保存到计算机的存储中就需要用计算机能够识别的字节(二进制的0和1)来表示,字符编码就是定义并转换人可以识别的字符和二进制码的规则,就像map的key,value一样,并且是双向且唯一的。
2. 为什么有unicode
最初的字符编码是ASCII码,仅仅只支持128个字符,无法支持多语言环境,国际标准组织提出一种标准方案于是unicode诞生了,但它仅仅是标准,即汉字“刘”唯一对应unicode的0x5218,二进制表示为?01010010 00011000?占用两个字节。
3. 二进制如何存储
字符对应的二进制码有了,还有个问题就是如何存储到计算机中,容易想到的就是取最大占用的字节数然后直接按位存储到计算机(UTF-32,每个字符都是4个字节,定长编码),现有unicode最大四个字节,存储“刘”就是00000000 ?00000000 01010010 00011000?,问题又来了,高位的两个字节全零没有任何意义浪费空间,英文字符浪费更严重,于是UTF-8诞生,它以变长方式编码,根据字符的不同变换长度,兼容ASCII。
4. python相关概念
python2默认编码方式为ascii,如果文件中出现非ascii,直接执行会报错
File "test.py", line 10
SyntaxError: Non-ASCII character '\xe5' in file test.py on line 10, but no encoding declared;
需要显示指定编码方式,在文件头添加
# -*- coding: utf-8 -*-
5. windows cmd乱码问题
如果windows环境,cmd是gbk解码方式打印字符串,也就是说一个有utf-8声明的py文件中的中文字符打印到终端并且显示,cmd还需要再进行一层转换,即utf-8---->gbk,但是这种直接转换对非ascii是无效的,所以直接在win的cmd print一个中文字符会出现乱码
print '刘'
result:
鍒
解决方法有两种
将中文字符显示声明为unicode,unicode转gbk是可以的,因为unicode相当于一个所有字符的超集
print u'刘'
result:
刘encode,decode,这两个函数都是相对于Unicode来解释的
编码(encode):将Unicode字符串(中的代码点)转换为特定字符编码(utf-8等)对应的字节串的过程和规则
解码(decode):将特定字符编码的字节串(utf-8等)转换为对应的Unicode字符串(中的代码点)的过程和规则
str_utf_8 = '刘'
print str_utf_8
print str_utf_8.decode('utf-8') #decode参数是字符串的现有编码方式,此处将utf-8转换为unicode
print str_utf_8.decode('utf-8').encode('gbk') #encode参数是需要转换的编码,此处将utf-8转换为unicode然后又以gbk编码
result:
鍒
刘
刘
6. scrapy乱码和search问题
scrapy中extract()提取出来的数据是unicode编码,print出来是\uXXXX的形式,基于其内容的search操作应该使用unicode编码的正则表达式,即使用u'刘'方式
responseHtml = response.xpath('//*[@id="content"]').extract()
nextChapterUrl = re.search(u'<a href="(./|([0-9]+_[0-9]+|[0-9]+).html)">(第二页|下一页|返回列表)</a>', ''.join(responseHtml)).group(1)
scrapy将unicode形式的数据写入文件默认为utf-8编码无需转换,item导出到json需要在命令行使用以下参数
-s FEED_EXPORT_ENCODING=utf-8
参考:
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »