菜鸟学Python(4):编码问题

python:编解码器基类之流式的编码和解码 阅读详情
 菜鸟学Python(4):编码问题
                                                                   ---- 温铭  http://blog.youkuaiyun.com/wayne92
    
       学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,感谢)
使用codecs模块,在Python中完成字符编码
字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法。从单字节到多字节叫做decoding,从多字节到单字节叫做encoding。在这些规则中经常用到的无非是UTF-8和GB2312两种。
 
在Python中,codecs模块提供了实现这些规则的方法,通过模块公开的方法我们能够方便地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。
 
使用“import codecs”导入codecs模块。
 
codecs模块中重要的函数之一是lookup,它只有一个参数encoding,指的是编码方式的名称,即utf-8或者gb2312等等。如下示例:
>>> 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]
lookup函数返回一个包含四个元素的TUPLE,其中T[0]是encoder的函数引用,T[1]是decoder的函数引用,T[2] 是UTF-8编码方式的StreamReader类对象引用,T[3]是UTF-8编码方式的StreamWriter类对象引用相信对Python熟悉 的你肯定知道接下来该怎么用它们了。
 
codecs模块还提供了方便程序员使用的单独函数,以简化对lookup的调用。它们是:
  • getencoder(encoding)
  • getdecoder(encoding)
  • getreader(encoding)
  • getwriter(encoding)
如果我们只是想获取一种utf-8编码的encoder方法,那么只需要这样做:
>>> encoder = codecs.getencoder("utf-8")
 
另外,对于StreamReader和StreamWriter的简化, codecs模块提供一个open方法。相对于built-in对象File的open方法,前者多了三个参数encoding, errors, buffering。这三个参数都是可选参数,但是对于应用来说,需要明确指定encoding的值,而errors和buffering使用默认值即 可。使用方法如下:
>>> fin = codecs.open("e://mycomputer.txt", "r", "utf-8")
>>> print fin.readline()
这是我的电脑
>>> fin.close()
 
总结一下,codecs模块为我们解决的字符编码的处理提供了lookup方法,它接受一个字符编码名称的参数,并返回指定字符编码对应的 encoder、decoder、StreamReader和StreamWriter的函数对象和类对象的引用。为了简化对lookup方法的调用, codecs还提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和 getwriter(encoding)方法;进一步,简化对特定字符编码的StreamReader、StreamWriter和 StreamReaderWriter的访问,codecs更直接地提供了open方法,通过encoding参数传递字符编码名称,即可获得对 encoder和decoder的双向服务。
-----------------------------------------------
PS:对Python里面的编码总算有个比较清楚的认识了,为了避免麻烦,自己写程序好文件的时候,都在前面加上# -*- coding: utf-8 -*-为好。

 重要补记(二零零六年九月七日下午):

一、上面的例子请在命令行下测试,在IDLE下有些会有错误!!我已经决定再也不用IDLE了,太痛苦了,debug半天才发现是IDLE的bug!!

二、刚才用C扩展Python,发现在Python里面传一个字符串给C,在C中打印,如果其中有中文字符,就会有乱码。(如果你没有在文件中加# -*- coding: utf-8 -*-,就不会有这个问题)

解决方法如下:
s  =  u " 欢迎使用rss阅读器 "
s
= s.encode( ' gbk ' )                       
libConsole.ConsoleOutput(s)   
# libConsole是用C封装成的一个dll,
                                                       # ConsoleOutput(s) 是用C写的一个方法,就是
                                                        #一个printf语句


PS:(2007.11.29)
环境:mysql(utf8编码),eclipse(utf8编码),windows xp
问题:在mysql中显示为中文,程序select出来在eclipse ebug窗口显示为中文,print为乱码,makedirs后为乱码。
解决:path.decode('utf-8').encode('gbk')
先按utf8解码,再按gbk编码
在mysql里面可以看到字符的二进制编码,很好。这个以前没有注意过
Python环境的搭建+pycharm的安装 小白版 菜鸟教程 文章目录Python环境的搭建1. 下载python2. 安装3. 手动添加环境变量4. pip操作命令4.1 基本安装命令4.2 换源安装4.3 下载到本地安装4.4 升级pip5.代码编辑器5.1 下载5.2 安装5.3 试运行6. PyCharm的简单配置6.1 主题的修改6.2 修改字体6.3 关闭软件更新功能6.4 设置快捷键6.5 自动导包设置6.6 自动打开上次的项目设置6.7 运行项目的几种方式6.8 添加头部文件6.9 编码设置 Python环境的搭建 Python是一个跨平台可移植的编程 阅读详情

相关推荐

python 编码问题 UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xb4 in position 0: invalid start byt

解决python下的一种编码问题

rifengxxc的博客 1万+

Python之数据流(stream)

本文参考Python官方文档针对官方文档示例进行解析,解析不完整只为了便于理解;流是用于处理网络连接的高级async/await-ready原语。流允许发送和接收数据,而不需要使用回调或低级协议和传输。

chenchen5152的博客 1万+

学python的那些事——初学python之菜鸟的起航

大家好。你们可以叫我大C或者菜鸟C。目前功能测试一枚。学python差不多一个月的时间。接下来我会为大家分享,这一个月的时间,我所学习到的东西以及做的笔记。 首先我来讲一下为什么我会去学Python。 首先,肯定是为了钱,为了更高的工资。 其次当我做了2年的功能测试,并感觉到自己无法在功能测试上取得长足的进步的时候,我意识到了,我必须做点什么,去提高工作效率。去解放劳动力。 在学习pyth

qq_24180827的专栏 620

第十章 掌握Python的文件处理

仅个人记录学习

weixin_43888054的博客 685

【Cubietruck】Qt5.8.0 x64、x86、armhf三个版本的编译安装

一、       Preparation 以下环境配置支持虚拟机和实体机,但是实体机生产效率会相对高一点,实体机编译Qt的速度是虚拟机两倍以上。 若使用虚拟机,推荐使用VirtualBox,开源免费,尽量不要使用Vmware破解版。   Download List   名称 链接 下载项目 OS https://mirro

beatfan的博客 3658

Matplotlib图片尺寸调整全攻略:从figsize到savefig的实战技巧

在数据可视化与科学计算中,图形尺寸控制是影响图表可读性与专业度的基础环节。其核心原理在于协调逻辑尺寸(英寸)与物理输出(像素)的映射关系,这直接决定了信息呈现的清晰度与布局合理性。从技术价值看,精准的尺寸控制能提升图表在不同媒介(如学术论文、报告、网页)中的适配性,避免显示不全、模糊失真等常见问题。在应用场景上,无论是Jupyter Notebook中的交互探索、自动化报告的批量生成,还是满足严格出版要求的插图制作,都需要掌握对应的尺寸调整策略。本文聚焦于matplotlib中的figsize参数、rcPa

weixin_30899023的博客 328

Python的协程异步IO(asyncio)详解

协程不是系统级线程,很多时候协程被称为“轻量级线程”、“微线程”、“纤程(fiber)”等。简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换。协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核,但部分操作系统中用户态线程的切换需要内核态线程的辅助。协程是编程语言(或者 lib)提供的特性(协程之间的切换方式与过程可以由编程人员确定),是用户态操作。协程适用于 IO 密集型的任务。

创作不易,请多支持,将为本站提供更多「有价值的文章」。 1万+

海康威视门禁考勤设备数据对接实战:从被动推送到主动拉取

本文深入探讨了海康威视门禁考勤设备数据对接的两种核心方案:HTTP推送与SDK主动拉取。文章对比了两种方式的适用场景、技术实现与优缺点,为开发者提供了从设备配置、代码编写到工程化部署的完整实战指南,帮助读者根据项目规模、网络环境及数据稳定性要求,做出最合适的技术选型。

weixin_29284657的博客 665

Python编码规范Google_菜鸟教程PDF下载:助你提升编码质量

Python编码规范Google_菜鸟教程PDF下载:助你提升编码质量 【下载地址】Python编码规范Google_菜鸟教程PDF下载 《Python 编码规范(Google) _ 菜鸟教程》是一份由Google制定、菜鸟教程整理的权威Python编程规范文档。它详细介绍了Python编程的基本规则、代码风格、命名约定...

gitblog_06795的博客 794

Ros入门 (十)----激光雷达避障 简易实现

本篇文章通过订阅/scan话题获取障碍物的距离信息,达到避障目的,提供部分代码,仅供参考。

weixin_51157015的博客 1万+

教你写出高质量SQL(实践必备)

1、查询SQL尽量不要使用select * ,而是select具体字段。 //反例子 select * from sys_user; //正例子 select id,name from sys_user; 理由: 只取需要的字段,节省资源、减少网络开销;select * 进行查询时,很可能就不会使用到覆盖索引,就会造成回表查询; 覆盖索引:只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。 例如: 回表查询:先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记..

ANGEL CITY 9996

《Python 编码规范(Google) _ 菜鸟教程》PDF下载

《Python 编码规范(Google) _ 菜鸟教程》PDF下载 【下载地址】Python编码规范Google_菜鸟教程PDF下载 《Python 编码规范(Google) _ 菜鸟教程》是一份由Google制定、菜鸟教程整理的权威Python编程规范文档。它详细介绍了Python编程的基本规则、代码风格、命名约定、注...

gitblog_06749的博客 544

RAGFlow体验大提升:使用GPU加速

场景:在正常部署过程中,启动RAGFlow会用到docker-compose.yml文件来启动。但是在实际使用过程中,会发现RAGFlow极其的卡和笨重,给一一种很不好的用户体验,有没有一种可以让RAGFlow加速的呢?进入RAGFlow的docker目录下会有发现有很多docker的配置文件。方法一:选择docker-compose-gpu.yml这个来启动项目。两个方法选其一 ,就会让你的RAGFlow的使用起来非常的丝滑!方法二:在docker-compose.yml末尾加上。

Ven%的博客 3156

python 菜鸟教程

菜鸟教程学习笔记http://www.runoob.com/python/python-tutorial.html 1. 基础语法 1)2.7版本执行 print 'hell\'o' 与 print "hell'o" 执行结果都为 hell'o → 单引号双引号都可以,差别在双引号内可以直接加单引号,否则需要转义; 三引号:“所见即所得” 可以由多行组成。 prin...

qq_31260485的博客 1万+

YOLOv11改进 | 注意力篇 | YOLOv11引入CBAM注意力机制

我们的实验表明各种模型的分类和检测性能得到了一致的改进,证明了 CBAM 的广泛适用性。简单介绍:CBAM的主要思想是通过关注重要的特征并抑制不必要的特征来增强网络的表示能力。模块首先应用通道注意力,关注"重要的"特征,然后应用空间注意力,关注这些特征的"重要位置"。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 2万+

OpenClaw进行安全测试(附使用场景案例)

test-master 是一个全面的测试专家,覆盖功能测试、性能测试、安全测试三大领域。这里我们重点来看下使用test-master如何进行安全测试。使用 test-master 时,可以针对以下高频领域进行专项安全扫描:✅ OWASP Top 10 测试✅ SQL 注入测试✅ XSS 测试✅ CSRF 测试✅ 认证 / 授权测试。

十二测试录 330

难怪大家都建议我上这5个网站学Python!

这五个网站各具特色且广受好评,是学习Python的绝佳选择。无论是初学者还是有一定经验的程序员,都可以在这些网站上找到适合自己的学习资源和项目实践机会。这只是冰山一角,想要完整版的小伙伴下图获取~04,Python小白必备手册。03,Python面试集锦。01,Python大礼包。02,Python电子书。05,Python安装包。06,数据分析全套资源。

2301_78095812的博客 1209

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

菜鸟学Python(10):初学JSON

    项目中web数据交互用的都是JSON格式,前两个星期没有遇到,今天终于郁闷到了,呵呵。google了一把,感觉JSON比xml解析更简洁,更快速,格式很像Python里面的字典。开始引用......一、JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programmin

wayne 我的陋室我做主 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python在线工具 菜鸟工具,python 在线运行 菜鸟

网址: [ ]介绍: 支持 支持python3 PHP C C++ Go Java NodeJS Lua Groovy BashPython所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)

l463747243的博客 3355

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

request python菜鸟教程_Python之学习菜鸟教程踩的坑

当你使用表单创建get请求时你输入“菜鸟教程时”会出现这样的页面可以查看到PyCharm中报错为这个UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)解决方法:只要在search.py文件中添加# -*- coding: utf-8 -*-import s...

weixin_39732027的博客 638

python3在线工具菜鸟工具,python在线工具 菜鸟工具

这里顺便总大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交流讨教!只要你打开一个网页,然后点击任何一个网络元素,Xpath Helper 就能自动帮你找出相应的 Xpath 语法。如果要说最好的爬虫工具,最好的爬虫工具非浏览器自带的开发者工具莫属!

npy199331的博客 922

《菜鸟学python——挖雷篇》1.1 python3体系下:中文编码格式问题的若干总结

Python3.X 源码文件默认使用utf-8编码,所以在编辑器敲代码时预先将编码格式设置为utf-8,即可正常解析中文,无需显示指定 UTF-8 编码。 1、包含中文的注释: 在非utf-8编码格式下,若要写包含中文的注释,则需要显示声明转换为utf-8格式,如: 1、# -- coding: utf-8 --  或者 2、#coding=utf-8  两者二选一放开头即可; ...

Fuguir™的博客 389

菜鸟学Python(14):Django中的url编码

遇到这样一个问题:客户端通过url将一个字符串传给服务器,服务器再将它写入数据库。如果url中没有中文,当然没有问题。当有中文的时候,就会有编码的问题。最后找到的解决方法是:不能直接在浏览器地址栏中敲汉字,而是必须从utf-8编码的网页中链接过去。比如: http://localhost/keyword/我    这样的链接,直接在浏览器中敲,则会变成各种各样的地址(不同的浏览器有不同的做法,IE

wayne 我的陋室我做主 4204

python教程菜鸟变高手_python教程菜鸟教程学习路线

python教程菜鸟教程学习路线,需要学Python 环境搭建、Python 中文编码、Python 基础语法、Python 变量类型、Python 运算符、Python 条件语句、Python 循环语句、Python While 循环语句、Python for 循环语句、Python 循环嵌套、Python break 语句、Python continue 语句等内容。Python是一种解释型、...

weixin_39871649的博客 344
上一篇: 血汗工厂当事企业富士康状告报业记者 索赔3000万
下一篇: 菜鸟学Python(5):IDLE的一个bug(怎么总遇到bug?)
wayne92
博客等级 码龄23年 55粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值