我的python中级班学习之路(全程笔记第一模块) (第二章)(第4部分:16进制、编码转换、bytes类型与存储、py3代码流程与转换方法、py2与py3的区别与总结)

第二章                       数据类型    字符编码    文件操作

第四部分

 第十节 :16进制运算

 

一、定义与语法

图例:

**16进制转换**代码验证

例:
1.八进制
>>> oct(1)     
'0o1'                #'0o1'  0o 是八进制的显示方式,后面的数字是多少位,就代表多少位
>>> oct(8)    
'0o10'
>>> oct(16)          #逢 8 进位
'0o20'
>>> oct(32)     
'0o40'               #8的多少倍就代表多少位
>>> oct(64)
'0o100'              #用的很少知道就行

2.十六进制
>>> hex(1)
'0x1'
>>> hex(15)         #十六进制中 f 代表15,因为在16进制中,不能出现10或者10以上的2位数字
'0xf'
>>> hex(16)         #十六进制是逢16进位    0x是16进制的显示方式
'0x10'
>>> hex(32)
'0x20'
>>> hex(64)         #16的多少倍就是多少位
'0x40'

  二、十六进制的特征及用途

       1.十六进制特征:16进制便于阅读,现在的存储设备都使用16进制为单位设置的

图例

 1.数字、二进制、十六进制之间的转换

  

例:
1.用数字查找ASCII码表里面对应的字符
>>> chr(100)
'd'
>>> chr(120)
'x'
>>> chr(123)        
'{'                    #返回对应得字符

2.数字转换二进制
>>> bin(97)
'0b1100001'    

 三、十六进制与二进制的转换:七张图了解16进制与二进制的转换

图1:                                                               图2:                                                 图3:

图4:                                                               图5:                                                          图6:

图7:

第十一节:  字符编码间的转换与python的bytes类型

一、编码的回顾

1.编码的总类型

* ASCII 码,最早期的编码,占 1个字节的内存,只有英文。

** GB2312 占2个字节, 支持6700多个汉字。

*** GBK  ,GB2312的升级版,支持21000多个汉字。

**** shift - JIS  日本字符。

***** ks_c_5601-1987  韩国编码。

******TIS—620  泰国编码。

由于每个国家都只有自己国家的编码,太局限,不好在国际上流通,缺少统一性。

*******unicode:万国码应运而生,2-4个字节,已收录136690个字符,还在不断的扩张中,主要作用有2个:1.支持广泛,兼容旧编码。2.它包含了跟全球所有国家编码的映射关系,缺点是:英文原本1个字节,在这里面却是2个字节,浪费空间翻倍的字节带来内存与流量翻倍,所以为了优化便与存储节省空间。后续出现三个unicode 的升级版分别是:

*UTF - 8 :(使用最广泛的语言)    分别用  1 ,2,  3,4 个字节表示,优先使用1个字节,无法满足再加1个字节,英文占 1 个字节 ,欧洲语系占 2 个字节,东亚占 3 个字节,其他占 4 个字节。

**UTF - 16 使用2-4个字节表示,优先使用2个,否则使用4个

***UTF - 32 全部用4个字节表示所有字符

总结:UTF 类编码是unicode编码设计的在存储和传输时节省空间的编码方案。

2、字符存储硬盘的方法:二进制

  (1).字符存储模式:(怎么存储和读取的)

        首先:字符一定是用0101等二进制存储的,但是由于存储时使用编码的标准不一样(UTF - 8、GBK、ASCII 码表....等等),所以你用什么编码保存的,就要用什么编码去读取,否则会出现乱码现象。

图解:

      (2).字符编码的转换:

               虽然unicode统一了所有国家的编码,但是 大多数国家还是在用自己国家的编码,中国就用 GBK 但是中国的编码出口到外国需要怎么的转换呢?unicode编程语言所有的电脑系统都会默认支持,把 中国的 GBK 放到 unicode 里面。映射出的 unicode 编程格式显示就可以了(unicode在这里相当于一个翻译)

图解:

******字符编码映射关系图解:

  二、  python3执行代码流程及转换方法

  1、在python3里面

      所以在python3里面写的代码去Windows上面去执行,不会乱码

 2、特殊情况,python2里面默认的编码是ASCII 码表。

    **在python2里面,python2并不像python3自动转unicode,而是仅以文件头声明的语言去解释和保存你的编码,如果以 UTF - 8解释和保存,在Windows系统上就会出现乱码,因为Windows系统默认支持的终端语言是GBK ,虽然Windows 默认支持unicode ,但是,python2 并不会自动把保存UTF - 8 格式的代码转成unicode 。 

********乱码肯定是不行的,既然弄不好自动转,就人肉转了。

**因为太生手,所以搞不好python2 与 Windows 之间的转换直接上图解:

*****整体思路就是先把python代码转换成unicode给Windows阅读,在转回utf - 8 或GBK 存储,  **在python2里面,不是unicode就是str 字符串类型。

##记住下图的规则,就能懂了

*#*总结:1、在python3里,默认编码是 utf - 8 ,字符串默认编码是 unicode ,如果文件头声明了其他编码,存起来的字符串依然会自动转unicode 。

                 2、在python2里,默认编码是ASCII 码 ,字符串默认是 ASCII 码,如果文件头声明了编码,那么,字符串也会是什么,不会自动转unicode。因为unicode在python2里面是一个单独的类型。

三、 python3通过查看编码映射表确定编码类型

    1、上边讲过转换代码的方法,那是在知情的情况下进行的。但是,如果不知情,不知道源代码,也不知文件头声明,怎么判断代码的转换语法是正确的呢

   (1).要有unicode编码关系映射表的exe,通过 把代码转换成二进制(或者16进制)在编码关系映射表里找到对应的编码,把16进制转换成二进制(二进制换算)

(2).GBK在设计时,为了兼容ASCII 码表,(ASCII码表只有127位,所以128位省略掉)所以GBK设计时规定,如果连续两个高字节的话,就认为是中文,高字节就是都超过了128位。unicode 在设计时,知道GBK的规定,所以默认忽略掉了最高一位的表示单位,

四、python的bytes类型介绍

1、定义:bytes ,就是在python里面显示的二进制串 

图解:

2、在没有特殊的情况下二进制串其实就是字符串,在有图片中的二进制串就不能叫字符串了,这就是区分bytes类型的原因。没法找到对应的文字,

但是也是二进制串,的显示。这样的二进制串叫bytes类型就不足为奇了,所以,二进制串全部称为  bytes  类型

五、python3与python2的字符串区别 

1.在python2里

*str = bytes    为什么有bytes类型?

因为 :要表示图片、视频等二进制格式 的数据,就要用bytes 类型表示,

**以UTF - 8  写的编码字符串,在Windows上没办法显示,如何在python2里写的代码让全球通用都能看呢?

就要以unicode 编写代码软件了有两种方法可以实现,第一种就是在文件头直接声明用unicode,第二种 就是把utf- 8 转换成unicode,转换的语法

s = you_str.decode(UTF - 8)比如你的代码变量名为 s ,就要 s.decode(UTF - 8)

***在python2里 有一个单独的类型  :unicode类型  

****语言格式需要转换,因为存到内存的编码,就是文件头声明的编码,不会转换其他格式

例:

在python2里 :以utf - 8 或 gbk . . . 写的代码 ,内容加载到内存里并不会被转成unicode 类型,依然 是utf - 8 或gbk ...

在python3里:以utf - 8 或 gbk . . . 写的代码,内容加载到内存里,会被自动转成unicode 类型。

 

2. 在python3里 

str = unicode(在python3里 ,默认支持 unicode,不是ASCII 码表,所以没有unicode 这个单独的类型)

六、总结

1、python2 与python3的转变

 因为 py 2 问题太多,满足不了太多用户的需求,特别是在支持的语言上(ASCII 码表)

所以py 3 横空出世,解决了很多问题,最重要的就是窜出时默认用unicode 格式,写文件默认使用 utf - 8 ,这样无论是在哪里都能正常显示文件

除此之外,还把str 和 bytes 进行了明确的区分,

str 就是unicode 格式的字符 

bytes 类型 就是二进制串

2、处理python编码问题的方法

最后,再提示下,python只要出现各种编码问题,无非是一下几种常见编码错误的原因

python解释器的默认编码是否有问题(py2 ASCII码,py3 unicode)

写的源文件的编码,与文件头声明解释的编码是否一致例:(文件使用utf - 8 写的,在读取文件时文件头却声明 gbk 格式)

 在pycharm里面转换的时候(轻易不要转),用utf - 8 写的代码,转换 gbk (convert),转换不成就会乱码,不能回退,如果这样的话就意味着要重新写一份代码

还有就是运行终端,运行终端是继承操作系统的编码(Windows 默认 gbk ,linx默认是utf - 8 ,这些是可以改的,但是尽量   要用什么格式写的,就以什么格式去读)

**小结:以上方法掌握之后,挨个排查基本上能解决问题 

 

 ——————————————模块结束线——————————————2018-11-06

原文地址:https://www.cnblogs.com/guoyilong/p/9906094.html