关于Python2字符编码的体会
对于Python的字符编码问题也懵了很久,最近做爬虫多次遇到网页转码的问题,干脆彻底解决掉!Just Do it!
1.两种类型str与unicode
str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对 UTF-8编码的str'汉'使用len()函数时,结果是3,因为实际上,UTF-8编码的'汉' == '\xE6\xB1\x89'。
unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'汉') == 1。
也就是说,str里面是以字节(8位)为单位,一个字符在str里面如何储存取决于其编码方式,从这个意义上讲,str类似于C中的char数组,而unicode类型类似于C++中的string,至于里面具体是如何存储的,可以当做黑盒。
测试一下:
从上面可以看出,print函数输出字符串时,该字符串若有中文,最好用unicode类型。
另外,python中字符串常量的类型为str,前面加u,则类型为unicode。
2.源码编码,外部编码
源码编码
源码编码指的是python脚本源码的编码方式,
源代码文件中,如果有用到非ASCII字符,则需要在文件头部进行字符编码的声明,如下:
#encoding:utf8声明的编码必须与文件实际保存时用的编码一致,否则很大几率会出现代码解析异常。现在的IDE一般会自动处理这种情况,改变声明后同时换成声明的编码保存。
这点主要体现在源码中出现了中文字符串常量,则常量的编码方式与上方的定义编码相同(也与文件的保存编码相同)。
例1
输出:
例2:
输出:
很直观,当更改了上方的编码后,str内部编码结果也被改变了。
外部编码
外部编码是指当读取文件,获取网页时所获得的str对象其编码方式,比如读取的网页编码方式可能是gbk,读取的文件文本可能是以utf-8方式编码。
4.decode与encode
decode是将str以何种解码为unicode类型;encode是将unicode编码为何种类型str。
decode与encode是str与unicode两种类型间转换的桥梁。
举例如下:
从上图可以看出,python命令界面是以utf-8为默认编码方式,即常量'你好'是以utf-8编码的str对象。
一般而言,
从外部读入str,用decode进行转换unicode类型;
保存至外部文件,将unicode用encode进行编码。
4.默认编码
python2.x中在处理中文时,大多数出现错误的原因所在:python的默认编码,defaultencoding是ascii,看这个例子:
# -*- coding: utf-8 -*-
s = "人生苦短"
s.encode('gbk')上面的代码会报错,错误信息:UnicodeDecodeError: ‘ascii’ codec can’t decode byte ……
因为你没有指定defaultencoding,所以它其实在做这样的事情:
# -*- coding: utf-8 -*-
s = "人生苦短"
s.decode('ascii').encode('gbk')设置defaultencoding的代码如下:
reload(sys)
sys.setdefaultencoding('utf-8')如果你在python中进行编码和解码的时候,不指定编码方式,那么python就会使用defaultencoding。
比如上一节例子中将str编码为另一种格式,就会使用defaultencoding。
s.encode("utf-8") 等价于 s.decode(defaultencoding).encode("utf-8")再比如你使用str创建unicode对象时,如果不说明这个str的编码格式,那么程序也会使用defaultencoding。
u = unicode("人生苦短") 等价于 u = unicode("人生苦短",defaultencoding)默认的defaultcoding:ascii是许多错误的原因,所以早早的设置defaultencoding是一个好习惯。
5.总结
其实str与unicode应该说是完全不同的两种类型,str作为默认字符串的类型,也是读入外部字符串的默认类型,内部是以字节为单位,类似于C的的char[],而unicode类似于C++中的string类型,是一个类,其内部如何存储,我们并不关心,只需要会调用其接口即可。
尽管这种理解可能不到位,但实际应用应该还是够用...
关于Python2字符编码的体会的更多相关文章
- 转:Python2字符编码问题汇总
这篇文章的部分问题在Python3以后不再存在,老猿只是觉得文章的部分内容还是有参考价值,因此在此原文转发连接: Python2字符编码问题汇总
- 不想再被鄙视?那就看进来! 一文搞懂Python2字符编码
程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广,作为一个Python程序员,自然最关心的是下面这幅图啦 我们项目组一值使用 ...
- Python2字符编码问题汇总
目录 从字符编码说起 unicode与utf-8 当编解码遇上Python2.x unicode 与 str 区别 __str__ __repr__的区别 unicode str utf-8关系 un ...
- Python2.7 中文字符编码 & Pycharm utf-8设置、Unicode与utf-8的区别
Python2.7 中文字符编码 & Pycharm utf-8设置.Unicode与utf-8的区别 zoerywzhou@163.com http://www.cnblogs.com/sw ...
- Python2/3的中、英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode
摘要:Python中文虐我千百遍,我待Python如初恋.本文主要介绍在Python2/3交互模式下,通过对中文.英文的处理输出,理解Python的字符编码与解码问题(以点破面). 前言:字符串的编码 ...
- Python2与Python3字符编码的区别
目录 字符编码应用之Python(掌握) 执行Python程序的三个阶段 Python2与Python3字符串类型的区别(了解) Python2 str类型 Unicode类型 Python3 字符编 ...
- python2与python3 字符问题以及 字符编码 内容总结
python2与python3默认编码: python2:gbk print( u'上' ) 操作系统也是 gbk python3:unicode p ...
- Python2.7字符编码详解
目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3.1 ASCII(初创) 1.3. ...
- python2.7中的字符编码问题
0. 写在前面 起因:之前写个数据预处理程序的时候遇到了点问题,用re模块的正则查找方法search时总是找不出来(找错了或者出乱码),于是捣鼓捣鼓. 经过:查资料,做实验,发现用utf8编码的str ...
随机推荐
- algorithm(算法)
algorithm(算法) STL中算可以分为三种, 1.变序型队列算法,可以改变容器内的数据: 2.非变序型队列算法,处理容器内的数据而不改变他们 : 3.通用数值算法,这涉及到很多专业领域的算术操 ...
- (coco2d-x初学)xcode5.0安装 cocos2d-x2.2.0
cocos2d-x 2.0版本之后不再支持xcode模板安装. 下面介绍一下创建步骤:我下载的是cocos2d-x2.2.0版本 1.下载Cocos2d-x的地址点击打开链接 2.解压缩压缩包.打开终 ...
- sql 清除日志空间
USE DBCenter GO SELECT file_id, name FROM sys.database_files; 查找日志名称 USE DBCenter ; GO ALTER DATABAS ...
- RTB撕开黑盒子 Part 1: Datacratic's RTB Algorithms
这篇文章是讨论Datacratic所用的统计和经济理论的一些内容.我们开发了real time bidding算法s.为了实现广告主的目标,我们的算法自动地利用其它广告主的次优策略,并再查看广告的底价 ...
- 探讨 : Host在IIS上的WCF Service的执行方式
一个WCF请求由两个线程来完成 运行在IIS上的WCF service, 你可能会注意到一个比较有趣的现象. 当WCF service接收到一个请求时, 这个请求实际上会有两个线程在执行这个请求. 一 ...
- 用Winrar批量解压缩有密码文件方法,只需输入一次密码
老王上传的文件多是RAR压缩格式的, 每个系列下载完,都20多集,解压缩的时候要一个一个的输入密码,太浪费时间. 1) 把下载的需要解压缩的文件统一放到一个文件夹下. 2) 启动winrar程序 (从 ...
- VS XCOPY
有时在项目开发过程中,某个项目不直接依赖于另外一个项目,也就是说在编码上不需要使用另外一个项目上的代码,但实际运行的时候需要用到,我们通常的做法是把另外项目中需要用到的DLL拷过来放到该项目的BIN文 ...
- [Android开发常见问题-11] Unable to execute dex: Multiple dex files define 解决方法
最近在开发一个工程,其中用到了一个开源的库项目Android-ViewPagerIndicator. 这个项目是作为一个库出现的,如下图: 这个项目中包含了android-support-v4.jar ...
- Python数据库访问之SQLite3、Mysql
Python数据库访问之SQLite3.Mysql 现有的数据库管理系统有很多种,本文选择介绍两种DBMS:SQLite 3 和 Mysql. SQLite 3 SQLite 3是Python 3预装 ...
- Windows应用商店API
Windows应用商店API 动手实验 实验 8: Windows应用商店API 2012年9月 简介 编写Windows应用商店应用最令人瞩目的理由之一是您可以方便地将它们发布到Windows应用商 ...