注意:以下讨论为Python2.x版本

在学习Python之前,就听说过Python的版本圣战,最可怕的是有的写Py3的程序员觉得Py2是另一种语言....所以在刚开始学习的时候,我索性把Python3和Python2的文档都看了一遍。

在之后写爬虫的过程中,我还是选择使用了Python2.x来写,原因嘛,emmmmm,可能就是因为一些好用的库或者框架的示例代码也是用旧一点的版本,所以为了效率,先用旧版本上手得了。在学习Python2之前,我还特意去比较了2和3的区别,其中着重被提及的就是字符串编码的问题,于是乎我在看旧版本文档的时候很仔细的去阅读了Python2的字符串部分。

然而结局证明,仔细阅读之后还是too young too simple,在读取文件,处理参数,以及处理http链接的过程中,经常一运行,发生两个对于Python的开发者熟悉的不能再熟悉的报错了。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

怎么样,是不是非常眼熟上面的两句话,好吧,我承认我这个小白一开始发现有这种编码问题的时候,就是调用encode/decode各种调试,期望这两个函数中有一个能够生效,救救我苟延残喘的程序,而在最初的时候,好像这样做还挺有效果的。

但是好运不长,在编写爬虫的过程中,随着处理字符串的量越来越大,http请求参数越来越多,往往一个参数是由好几个参数拼接而成的,而有时候你并不知道是哪个地方出了问题,盲目的替换和使用encode/decode方法效率非常低下。而造成这个问题的原因,就是没有明确的思考为什么会出现编码错误,授人以鱼不如授人以渔,所以我们今天要来从根上探究一下这个问题。

编码的简介

首先,作为一名程序员,我想ASCII、Unicode、UTF-8三种字符编码大家肯定是听到过的,而这三种编码到底有什么区别呢?

ASCII是美国信息交换标准代码,是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以部分支持其他西欧语言,并等同于国际标准ISO/IEC 646。

Unicode是电脑科学领域里的一项业界标准,它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用以更为简单的方式来呈现和处理文字。

UTF-8是一种正对Unicode的可变长度字元编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字元,且其编码中的第一个位元组仍与ASCII相容,这使得原来处理的ASCII的软体无须或只须少部分修改,即可以继续使用,因此,它逐渐成为了电子邮件、网页以及其他存储或传送文字的应用中,优先采用的编码。

判断编码类型

在简单的介绍了三种编码之后,我们首先在处理字符编码问题的时候,搞清楚我们到底处理的是什么类型的编码。因为在Python中str和unicode都是basestring的子类,所以我们可以用下面的方法判断我们处理的类型是否为字符串:

bool = isinstance(s, basestring)

而str和unicode的转换也非常简单,总结一下就是如下的样子:

str -> decode('coding') -> unicode

unicode -> encode('coding') -> str

可以看出,str这个字符串,是由unicode经过编码后的字节形成的。而在字符串前面加u,就是unicode类型了。

例如:

s = '富强民主文明和谐'

s = u'富强民主文明和谐'.encode('uft-8')

>>> type('富强民主文明和谐')

而分析str字符串长度的时候,可以看到返回的字节数:

>>> u'中文'.encode('utf-8')

'\xe4\xb8\xad\xe6\x96\x87'

>>> len(u'中文'.encode('utf-8'))

6

每个中文在UTF-8编码中,通常占用三个字节,这个结果是正确的。值得注意的是,unicode的字符编码和utf-8的存储编码表示是不同的。

上面的代码是分析了utf-8字符串的编码,而接下来,我们要分析真正的unicode字符编码,

s = u'富强民主文明和谐'

s = '富强民主文明和谐'.decode('utf-8')

s = unicode('富强民主文明和谐', 'utf-8')

>>> type(u'富强民主文明和谐')

从长度来观察unicode字符串:

>>> u'中文'

u'\u4e2d\u6587'

>>> len(u'中文')

2

上面的结果是unicode的字符分析结果。

所以我们在处理字符串的时候,要搞清楚我们处理的str还是unicode,使用正确的处理方法来处理。

教给大家一个简便的记忆方法,不要对str使用encode,而对于unicode也不要使用decode。其实是有特殊情况的,但是为了少出错,建议新手先这么处理呢。

python字符串成熟编码_Python——搞定烦人的字符串编码相关推荐

  1. python降低图片分辨率_手把手:扫描图片又大又不清晰?这个Python小程序帮你搞定!...

    原标题:手把手:扫描图片又大又不清晰?这个Python小程序帮你搞定! 大数据文摘作品 编译:HAPPEN.于乐源.小鱼 一位乐于分享学生精彩笔记的大学教授对于扫描版的文件非常不满意--颜色不清晰并且 ...

  2. mysql编码转换搞定

    mysql编码转换搞定(转) 按照下面做法,终于成功了!庆祝,纪念...... 背景:某个系统的mysql数据库dnname采用默认的latin1字符集,系统升级需要将所有数据转换成utf-8格式,目 ...

  3. 区区几行Python代码,一分钟搞定一天工作量

    作者 | 陈熹.刘早起 来源 | 早起Python 大家好,我是早起. 前几天有一个读者说最近要整理几千份文件,头都要整秃了,不知道能不能用Python解决,我们来看一下,你也可以思考一下. 由于涉及 ...

  4. python使用教程pandas-十分钟搞定pandas(入门教程)

    本文是对pandas官方网站上<10Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯上 ...

  5. python正则匹配日期2019-03-11_都2019年了,正则表达式为啥还是这么难?这里的Python学习教程教你搞定!...

    都9102年了,你还觉得正则表达式很难?难,确实是还难啊! 这里南瓜跟大家总结的最新Python学习教程,教你搞定它! 正则表达式语法 字符与字符类 特殊字符: .^$?+*{}| 以上特殊字符要想使 ...

  6. python网络爬虫面试题,搞定这套Python爬虫面试题(面试会so easy)

    搞定这套Python爬虫面试题(面试会so easy) 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  搞定这套Python爬虫面试题(面试会so easy).t ...

  7. python 结尾回车_理解不了Python正则表达式?我帮你搞定

    点击蓝字"python教程"关注我们哟! 在学习Python的过程中,我们难免会遇到比较晦涩.难以理解的内容,比如Python中的正则表达式.面向对象等内容,为了更好地帮助大家理解 ...

  8. python基础知识-一篇文章搞定Python全部基础知识

    原标题:一篇文章搞定Python全部基础知识 前言: 1.Python软件安装 第一章.字符串及数字变量 1.变量 要点提炼:Python变量为强类型动态类型.换言之,变量很任性,你给他int,他就是 ...

  9. 加班奖励 python_“加班做了2天的方案,同事用Python半个小时就搞定了?”

    最近, 朋友娜娜跟我说,她想辞职了. 娜娜在上海一家公司做了 3 年的市场销售, 为了更好地完成业绩,每天都赶着最后一班地铁回家. 毕业 3 年,算上加班时长, 说是工作了 5 年也不过分! 像她这样 ...

最新文章

  1. maven 配置篇 之pom.xml
  2. 变化的和不变的。。。(2004版)
  3. [转]oracle 11g 忘记 默认用户密码
  4. 在html中 标题字体标记的最大取值,西南大学网络教育2020年春0834]《网页设计》作业标准答案...
  5. Android之定时器实现的几种方式和removeCallbacks失效问题详解
  6. python大型项目经验_图像分类:13个Kaggle项目的经验总结
  7. 【PAT - 甲级1094】The Largest Generation (25分)(dfs建树)
  8. Android多线程优劣,Android 开发中用到的几个多线程解析
  9. python3中import的那么些坑
  10. Apache ab并发负载压力测试
  11. xmlDocument来操作xml文档
  12. 中国松紧带市场趋势报告、技术动态创新及市场预测
  13. 机器学习基础(三十三)—— 皮尔逊相关度评价
  14. TIMESTAMP与DATETIME的区别
  15. Windows 8 页面应用测试(1)
  16. VC++6显示行号插件+VC6LineNumberAddin.dll+注册机
  17. java 某年某月的天数_Java练习 SDUT-1160_某年某月的天数
  18. 计算机电脑为什么0无法输入,电脑浏览器网页无法输入文字该怎么办?
  19. 如何制作一份疫情场所分布地图?(附数据和源码)
  20. linux查看硬盘信息命令

热门文章

  1. ScrollView示例
  2. obs多开教程_做了个OBS多路推流插件
  3. 直播电商软件开发,图片相册选择与拍照
  4. 云存储解决方案-华为云OBS服务的基础使用
  5. heroku mysql_在Heroku上使用
  6. 数字 IC 技能拓展(24)单口、伪双口、真双口 RAM、单口、双口 ROM 的区别与联系
  7. RK3568 AP6275S蓝牙驱动程序调度过程
  8. 快速查询圆通快递物流详情,并分析中转延误
  9. FIDO(身份认证标准):UAF(终端认证+私钥加签)/U2F
  10. IDEA 项目结构出现 0%classes,0% lines covered解决方法