没那么简单:decode encode open

学习小甲鱼的python基础 教程 那么长时间,这中间也有许多深入的思考,有些看似平常的东西,经过深入思考发现原来没那么简单,为了巩固自己的理解,同鱼油交流,特地整理成系列帖子,中间有什么理解或表达有误的地方希望鱼油指正,共同提升。

        今天探讨decode encode open

        这些涉及到编码,解码的问题,讨论这个问题先要讨论一下编程的整个过程,编程过程为:编辑器里打字-->保存编辑器--->编译代码-->结果。

        在你打开编辑器写下代码的时候,你可想过你打的这些字是什么编码格式么,在你保存编辑器的时候你可以选择保存格式比如'utf-8',然后你的内存里就有了'utf-8'格式的源码了,可是在变成'utf-8'格式前的编码是什么啊?也许你会说编辑器不是有默认格式么,但是你要明白那个默认格式是保存后的格式,保存前是什么编码呢?
        
        其实你用编辑器输入的每个字符包括数字都是unicode类型(这个类型是我猜测的,因为涉及到系统问题,无法验证),当你选择按照'utf-8'进行保存的时候会对你的代码进行编码,然后写入内存,至此内存里就有个utf-8格式的源码了。(字符1和数字1在源码中编码都是31,但是字符1前后有个引号,编译器就是靠检测引号来区别字符与数字的)

        运行的时候编译器会解析此源码,解析的时候如果也按照utf-8解析,那么源码内容会正确被编译器理解,但是要是换了解析格式那编译器就无法正确识别源码了。这就是为什么py2.x里保存源码用'utf-8',而在开头还要声明用'utf-8'来解析,至于py3.x默认的编码和解析都是'utf-8'.
        
       在py.3x中存在两种数据对象,分别为str和bytes,既字符串(unicode)和字节包(utf,gbk,etc..),而str对象对应的就是传说中的unicode编码,btyes字节包则是各种字节形式的编码对象。bytes对象定义时前边加b。
       
        str对象转成各种bytes对象

        >>> a='我'
       >>> a.encode('utf-8')
        b'\xe6\x88\x91'                                        #unicode---编码成----utf-8
        >>> a.encode('gbk')
        b'\xce\xd2'                                               #unicode---编码成----gbk
        >>> a.encode('unicode-escape')
        b'\\u6211'                                                 #str对象转化成bytes对象
        >>> 
        
        各种bytes对象转成str对象

        >>> b'\xe6\x88\x91'.decode('utf-8')
        '我'                                                                    #utf-8---解码成---unicode
        >>> 
        >>> b'\xce\xd2'.decode('gbk')
        '我'                                                               #gbk---解码成---unicode
        >>> b'\\u6211'.decode('unicode-escape')
        '我'                                                              #bytesr对象转化成str对象    
                                                                            # 其实看这个escape’逃离‘单词也能猜到,逃离一种对象成为另一种对象

        >>> 
        通过以上演示应该明白 :

        unicode---->编码----->其他编码   就是str对象转化成bytes对象

        其他编码---->解码---->unicode   就是bytes对象转化成str对象

        下面在讨论一下open中的默认文本模式与't'模式:

         默认文本模式对文件操作起来很是顺手,t模式对‘泡菜’数据或者照片等数据进行读写也很顺畅。

         但是有想过用‘t’模式对字符串进行操作么,如果‘t’模式也能操作字符串那要默认文本模式干嘛。

         不贴代码了直接说结果:

        ‘t’模式当然能对字符串读写,但前提是要把字符串对象转化成bytes对象,也就是对unicode进行编码,然后才能用二进制模式操作,‘t’模式选择是指定操作对象是str还是bytes。
          
        以上都是个人通过查询资料和上机验证的理解,有误的地方望指出,共同进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值