关于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 ...
随机推荐
- HTML5小游戏UI美化版
HTML5小游戏[是男人就下一百层]UI美化版 之前写的小游戏,要么就比较简单,要么就是比较难看,或者人物本身是不会动的. 结合了其它人的经验,研究了一下精灵运动,就写一个简单的小游戏来试一下. 介绍 ...
- iOS手动管理内存
虽然iOS已经有了ARC帮你自动管理内存,但在有些项目中必须采用手动的方式,而且在懂得手动管理内存的情况下会是自己的代码更加完善 众所周知,基于手动管理内存的情况下必然涉及到 relese reta ...
- WINDOWS下安装PHP7出现PHP-CGI无法启动
事情经过:下载PHP 7.0 然后运行,发现php-cgi一直挂掉.启动不起来.我直接到文件夹下启动PHP-CGI 启动, 失败,报错提示:缺失vcruntime140.dll.当时心中暗暗一笑,当年 ...
- 实现Avl平衡树
实现Avl平衡树 一.介绍 AVL树是一种自平衡的二叉搜索树,它由Adelson-Velskii和 Landis于1962年发表在论文<An algorithm for the organi ...
- JSP和JavaBean
JSP JSP全称是Java Server Pages.JSP实际上就是Servlet. JSP原理:JSP会被Tomcat翻译成一个Servlet JSP语法 1)JSP的Java脚本表达式 作用: ...
- 实用的android颜色配置表(亮瞎尼的双眼)
android开发中,常常会用到color.xml颜色配置,好的颜色配置可以让尼的应用让人看起来赏心悦目! 不罗嗦,上图先 该工程已经罗列了常用的颜色配置 附上工程链接:http://download ...
- 设计模式——(Abstract Factory)抽象工厂
设计模式——(Abstract Factory)抽象工厂 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难.你必须设计相关类,并设计类的接口和继承之间的关系.设计必须可以解决当前问题,同 ...
- Oracle体系结构及备份(十七)——bg-others
一 其他进程 Archiver (ARCn) Oneor more archiver processes copy the redo log files to archival storage whe ...
- C#中的文件操作1
1. 文件操作常用相关类 a)File //操作文件,静态类,对文件整体操作.拷贝.删除.剪切等. b)Directory //操作目录(文件夹),静态类 c)Di ...
- JQuery动态操作表格
新人,小白一枚,刚刚参加工作,所以会在这里记录一些遇到的问题. 最近要做的东西,是对一个表格动态的添加行,删除行,并且对表格中内容进行非空验证. <!DOCTYPE html> <h ...