内容简介:最近写了一些python3程序,四处能看到bytes类型,而它并不存在于python2中,这也是python3和python2显著区别之一。以前在写python2代码的时候,经常会遇到很多编码报错的异常,原因在于python2对unicode的支持不是特别理想。而在python3中,所有编写的代码都是unicode,python解析器在运行的时候,内部都转换(除非你显示定义为bytes类型)为unicode,减少了出错的可能性。在python3中,有两种字符串类型,默认的就是str,即unicode,也叫做
最近写了一些 python 3程序,四处能看到bytes类型,而它并不存在于python2中,这也是python3和python2显著区别之一。
以前在写python2代码的时候,经常会遇到很多编码报错的异常,原因在于python2对unicode的支持不是特别理想。而在python3中,所有编写的代码都是unicode,python解析器在运行的时候,内部都转换(除非你显示定义为bytes类型)为unicode,减少了出错的可能性。
在python3中,有两种字符串类型,默认的就是str,即unicode,也叫做文本类型。但一个程序总是会有I/O操作(磁盘,网络),即I/O二进制数据,在python3中定义为bytes类型。bytes类型就是一个个字节串,包含0~256 之间的一个整数。
那么如何定义bytes类型呢,有两种显示的方法,比如:
#只能允许ASCII值 x=b'abc' y=b'\xe6\x88\x91' print (x,y) #对unicode字符集进行特定编码 t=bytes("我们","UTF-8") #输出b'\xe6\x88\x91\xe4\xbb\xac' #一个中文字符,UTF-8编码占用三个字节 print (t) #返回6,对于python来说,就是字节序列的长度 print (len(t)) #返回2,代表两个字符 print (len("我们"))
接下去说说str类型和bytes类型之间的转换,比如从网络上读取到二进制数据后,python需要你显示的将其转换为str类型,也就是说 python不会隐式在str和bytes之间转换 ,看上去麻烦了很多,但会减少你出错的几率,自己明确自己做要的事情。
如果要将str转换为bytes,必须选择一个编码,明确二进制数据是如何编码的,比如:
x="我" y=x.encode("UTF-8") z=x.encode("GBK") #b'\xe6\x88\x91' b'\xce\xd2' print (y,z)
如果要将bytes转换为str,也需要一个编码,必须说明的是,你必须知道 二进制数据的编码是什么 ,如果选错了,转换为unicode的时候会错误,另外在python内部,它不关心二进制数据是什么编码的,只要是bytes类型, 它就是一串字节序列 ,比如:
x=b'\xe6\x88\x91' print (x.decode("UTF-8")) #会报错 print (x.decode("GBK"))
总之一句话,“ python内部使用unicode,外部使用bytes类型 ”,python内建库中,很多函数会说明需要str类型还是bytes类型(严格说来是bytes-like对象,比如bytes、bytearray ),在写代码的时候一定要看清楚,比如 hamc 库的new方法,就要求:
hmac.new(key, msg=None, digestmod=None) key is a bytes or bytearray object giving the secret key
很多库,尤其第三方库(比如requests)为了兼容python2和python3,会在内部做很多转换工作,让你意识不到bytes类型的存在,虽然生产力提高了,但对于理解python并没有太大的好处。
如果要充分理解bytes和str的应用,可以参考open和write两个内建函数。
使用文本方式打开文件,python在内部会自动转换为str类型,比如:
file ="t.txt" t = open(file,mode="r").read()
而如果是二进制方式打开,如果要显示在终端,需要转换为str类型,比如:
file ="t.txt" t = open(file,mode="rb").read() print (t.decode()) print (t,type(t))
而如果是二进制方式写入,则将bytes类型数据直接写入,比如:
file="t.txt" t=open(file,mode="wb") t.write(b'\xe6\x88\x91')
在上面几个例子中,都没有说明使用那种编码,如果不显示指定,一般编码等同于locale.getpreferedencoding() 。
以上是自己做的一个总结,后面也会写一些 PHP 7处理unicode的文章。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 编码、摘要和加密(一)——字节编码
- 新媒体编码时代的技术:编码与传输
- MySQL数据库字符编码总结--数据传输编码
- PHP 开发者学 Golang 之 URL 编码 (Urlencode)、解编码 (Urldecode)
- ios平台实现视频H264硬编码及软编码(附完整demo)
- Python 中文编码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
jQuery 技术内幕
高云 / 机械工业出版社 / 2014-1-1 / 99元
本书首先通过“总体架构”梳理了各个模块的分类、功能和依赖关系,让大家对jQuery的工作原理有大致的印象;进而通过“构造 jQuery 对象”章节分析了构造函数 jQuery() 的各种用法和内部构造过程;接着详细分析了底层支持模块的源码实现,包括:选择器 Sizzle、异步队列 Deferred、数据缓存 Data、队列 Queue、浏览器功能测试 Support;最后详细分析了功能模块的源码实......一起来看看 《jQuery 技术内幕》 这本书的介绍吧!