菜鸟学Python(4):编码问题
学Python以来,遇到不少关于编码方面的问题,总是知其然不知其所以然,糊里糊涂的。今天在邮件列表中看到甘晖问一个编码的问题,有不少高手解释。看了以后霍然开朗,记录一下,以后备查:)
一、(以下为张骏的解释,感谢)
个人认为python对unicode的处理已经相当完善了。
对于python来讲,字符集的处理有两个概念:
1 str 是指带有编码的字符串
2 unicode 是指不带有编码的字符串
这两个概念的相互转换是这样进行的:
str ------> unicode --------> str
decode encode
解码 编码
举个最简单的例子:
>>> a = '中'
>>> a
'/xd6/xd0'
>>> b = u'中'
>>> b
u'/u4e2d'
根据上面的描述,b应该是不进行编码的a的值(反正a就是b带有gbk编码的值)
于是,我们可以得到
>>> a.decode( 'gbk' )
u'/u4e2d'
同样也可以得到
>>> b.encode( 'gbk' )
'/xd6/xd0'
不知道我讲的清楚吗?
另外,甘晖遇到的这个xml解析的问题并不是python对编码集处理的问题。而是python的xml模块pyexpat.pyd不支持非utf-8编码的多字节xml的原因。为什么不支持,是因为xml的标准规范仅仅定义了utf-8做为多字节xml的编码,gbk(gb2312)并不是xml规范中允许的字符集。
因此,我们在处理gbk编码集的xml时,都是先将文件读取出来,然后转换为utf8格式,然后再解析
>>> f = file( r'c:/a.xml' )
>>> buf = f.read()
>>> ubuf = buf.decode( 'gbk' ).encode( 'utf-8' )
>>> xml.parser( ubuf )
...
调用字符串的decode和encode方法有一个好处是,不用显式import codecs模块,更不用lookup特定字符编码的decode和encode函数。但是这种方法不适用于对decode和encode方法多次重复调 用的场合,主要是从代码的执行效率方面考虑的。(这一段是 麦田守望者的意见)
二、(以下摘自麦田守望者的blog,感谢)
>>> import codecs
>>> t = codecs.lookup("utf-8")
>>> print t
(<built-in function utf_8_encode>, <function decode at 0x00AA25B0>, <class encodings.utf_8.StreamReader at 0x00AA0720>, <class encodings.utf_8.StreamWriter at 0x00AA06F0>)
>>> encoder = t[0]
>>> decoder = t[1]
>>> StreamReader = t[2]
>>> StreamWriter = t[3]
- getencoder(encoding)
- getdecoder(encoding)
- getreader(encoding)
- getwriter(encoding)
>>> encoder = codecs.getencoder("utf-8")
>>> fin = codecs.open("e://mycomputer.txt", "r", "utf-8")
>>> print fin.readline()
这是我的电脑
>>> fin.close()
-----------------------------------------------
PS:对Python里面的编码总算有个比较清楚的认识了,为了避免麻烦,自己写程序好文件的时候,都在前面加上# -*- coding: utf-8 -*-为好。
重要补记(二零零六年九月七日下午):
一、上面的例子请在命令行下测试,在IDLE下有些会有错误!!我已经决定再也不用IDLE了,太痛苦了,debug半天才发现是IDLE的bug!!
二、刚才用C扩展Python,发现在Python里面传一个字符串给C,在C中打印,如果其中有中文字符,就会有乱码。(如果你没有在文件中加# -*- coding: utf-8 -*-,就不会有这个问题)
解决方法如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#一个printf语句
菜鸟学Python(4):编码问题相关推荐
- python语言入门教程-菜鸟学Python入门教程大盘点|7个多月的心血总结
原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...
- python入门教程(非常详细)-菜鸟学Python入门教程大盘点|7个多月的心血总结
原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...
- 菜鸟能学python编程,菜鸟学Python编程文章阅读记录一
菜鸟学Python编程文章阅读记录 看的懵懵懂懂,感觉就是要把代码看懂到,这个代码块做了什么功能,了解到建了属性,定义了方法,这些方法与属性的关系 今天是js逆向专题,这个帖子,回头再好好看 回头再找 ...
- python数据分析相关论文_菜鸟学Python|数据分析精华文章大集合
原标题:菜鸟学Python|数据分析精华文章大集合 这是菜鸟学Python的第123篇原创文章 Python的数据分析是我比较喜欢的一个方向,因为可以探索数据里面的秘密,加上可视乎会非常漂亮,但是里面 ...
- python菜鸟入门_值得收藏|菜鸟学Python【入门文章大全】
这是菜鸟学Python的第106篇原创文章 阅读本文大概需要3分钟 菜鸟学python已经写了好多好多文章,我自己也没有想到能写这么多累计已经有110篇了,从入门篇写到了数据篇. 我觉得还有好多绝招, ...
- 菜鸟学Python(2):学而不思则罔(从一个Python Bug谈开)
菜鸟学Python(2):学而不思则罔 ---温铭 http: ...
- python语言type board_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题……...
针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...
- python wx窗口无法关闭_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题…...
针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...
- 小菜鸟学Python记
菜鸟原本是做城市规划的,对城市空间的大数据分析一直有所向往 后来参与城市更新政策研究,也需要通过数据手段去收集行业信息和分析人群行为 2019年前后,听闻有个Python技术很厉害,可以爬取全网的信息 ...
最新文章
- 【摩天好课推荐】传统企业数字化转型的困惑、思考与实践
- android游戏开发框架libgdx的使用(二十四)—physics-body-editor配合Box2D加快开发
- matlab组织的培训讲义,matlab培训讲义.doc
- netflix_Netflix播放按钮剖析
- python控制其它软件_从另一个脚本控制python脚本
- 初识spring-boot
- WIN2003设完C盘权限后终端连不上。
- pix2pix, CycleGAN和pix2pixHD(没有公式,容易理解)
- Skywalking-02:如何写一个Skywalking trace插件
- 测试kafka的连通性,自导自演生产者与消费者
- 图片相框展示的设计与实现
- 预约直播!抢CSDN纪念卫衣:开源是在为爱发电?
- [转载] python判断字符串中包含某个字符串_干货分享| Python中最常用的字符串方法
- 真不知道起什么名字了
- 进阶:案例三: Upload File using WebDynpro
- 回归预测 基于ELMAN递归神经网络预测及其matlab代码实现
- The Productive Programmer 读书笔记
- 如何使用Arduino 舵机SG90
- c语言常用逻辑符号,C语言常用逻辑符号.doc
- 几何平均数与AG不等式