第二章 数据类型 字符编码 文件操作
第四部分
第十节 :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