Mr liu jin

我是一个什么都想学却学不会的技术宅^_^目前在西安讨生活


Explore Me
Mr liu jin
我是一个什么都想学却学不会的技术宅^_^目前在西安讨生活
15
10
8
GP规范学习
智能卡 5218664b · 5年前

前面

之前有看一些英文规范,大概明白一些东西。现在的思路是,由于英文水平较差,首先看中文规范对此规范有了大概的了解之后然后详细研读英文规范,在看中文规范的时候也以英文规范辅助,英文规范是一手资料,中文版难免有所偏差。

每个字都认识,全部连起来就不知道什么意思了。

11.5
先看中文规范,通读一下,明白这个规范主要在讲什么,有哪些内容。

规范中涉及的东西太多,在不了解周边的情况下只看规范太过抽象

参考:

gp2.2 中文版GP2.1.1中文版

有关项目管理的思考
#### 目前没有接触过太多项目管理的知识也没太多的经验,但是编码过程中感觉需要一种高效管理项目开发
6年前 · 5218664b
python 2.7编码问题理解
# 写爬虫的时候遇到了字符编码的问题,详细了解一下 # 相关概念 ## 1.什么是字符编码
6年前 · 5218664b
git 修改commit message
### 1.首先 `git log` 看一下要修改的那次提交是第几次提交,最近的一次提交序号
7年前 · 5218664b
windows使用hmail搭建邮件服务器roundcube作为web客户端
使用软件: [hmailsever][1] [openssl for windo
7年前 · 5218664b
python 2.7编码问题理解
爬虫 5218664b · 6年前 · 浏览量:467

写爬虫的时候遇到了字符编码的问题,详细了解一下

相关概念

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:
鍒

解决方法有两种

  1. 将中文字符显示声明为unicode,unicode转gbk是可以的,因为unicode相当于一个所有字符的超集

    print u'刘'
    result:

  2. 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

参考:

Python中的字符串与字符编码

  评论
    1. 刘大神,坚持啊 我的博客都好久没更了

      1. 5218664b

        我也是刚想起来...

     评论已关闭