Day 13 20190128 老男孩python学习第13天 内容整理

视频看了5个小时

二进制 bin()

八进制 oct()

十六进制 hex()

因为二进制不易观察,所以使用十六进制便于观察, 1-9, abcdef,共15个

4个二进制对应一个16进制

ASCII 码表最低表示字符的单位是8bit,即1byte,8 bit = 2 * hex,2个十六进制位可以表示一个byte(字节),4个bit对应一个十六进制数

unicode占用了2-4个字节,虽然收录了几乎所有的语言,但是由于占体积太大,相比ASCII的1个字节,体积大了一倍多。

支持语言多是优势,体积大是劣势。

unicode不仅支持所有国家语言,同时包含了跟其他国家语言的映射关系。

体积大在存储,网络传输之类的作用上面影响很大,因此unicode不适合用于存储或者网络传输,但是在内存上读取时仍旧可以接受,因为内存速度快,而且一般使用的程序或者文件体积相对不大,影响不大

因而产生了unicode transformation format,即UTF,以便于在存储或者网络传输中节省空间,

  • UTF-8,英文依旧只占一个字节,欧洲语言占两个字节,东亚语言占三个字节,特殊字符等最多占4个字节。
  • UTF-16,使用2个或者4个字节表示一个字符,优先使用2个字节,否则使用4个字节表示,
  • UTF-32,使用4个字节表示所有字符。

UTF是为unicode在字符占用方面做出了优化的结果。

无论是以什么编码存储,最后都是二进制数,而在不同编码如ASCII,GBK,韩国,泰国,日本等等方式是不同的,对应的映射关系是不同的。

以GBK方式存储成二进制,再转回来读取时依旧以GBK的方式转回去,GBK相当于一个密码解释表,一串字符以GBK的规则进行解释,结果为一串二进制,倒过来解释时还是要用GBK。

虽然有一个万国语言unicode,但是大家不买账,各自还是使用各自的编码,中文window依然是GBK编码,而不是Unicode,所以当你用中文系统或者中文进行编程的时候,是使用的GBK编码,出口到国外时就会出现编码的不符合的问题,除非:

1. 外国终端装了GBK编码,几乎不可能。

2. 把GBK在存储的时候转换成为UTF-8,然后最后从存储读取时就变为Unicode,外国终端虽然不支持GBK,但是支持Unicode,比较可行。而且一次安装,包括其他语言终生使用。

当然了,转换成为Unicode之后,语言还是中文,只是可以运行了。

新开发的软件直接用UTF-8编码即可,但是老的GBK的软件就不太友好,这时候就可以使用Unicode的映射关系来进行代码的转换,GBK的编码转换成为Unicode,然后再通过Unicode转换成为UTF-8,这样就可以直接用老的GBK编码的软件。

“路”字在GKB代码是G0-4237,转换成Unicode就变成了8DEF,

Python执行代码的过程:

Python3里面,内存里字符串都是Unicode,不管你是GBK、UTF-8、ASCII等,执行的时候内存里字符串都是Unicode,默认读取文件的编码是UTF-8,

第一步,按文件头的注释加载编码方式,转成Unicode(对于初始读取文件时,文件就相当于一串字符串)

第二步,把代码按照语法规则进行解释,即语法分析

第三步,所有的字符都会以Unicode进行运行。(右下角会有编码的显示)

一个以UTF-8进行编写的代码,在windows上(GBK)环境下,运行就会变成乱码,因为字符在UTF-8和GBK的映射关系是不同的,运行就会变成乱码。

python3在读取UTF-8格式的代码的时候,自动转成了unicode,在内存中加载,因此在GBK的windows环境下运行有时不会出错。

而python2的字符串的默认编码是ASCII,不会自动转成unicode,在内存中仍旧是GBK或者是ASCII,当编码不同时就会出现乱码。

而python3相当于是python2多了一个手动转的过程,变成了unicode,

这个过程就叫 s2 = s.decode('UTF-8') --> 变成unicode,UTF-8是表示之前的编码,通过声明之前的代码规则,来进行转换,否则不知道规则不能转

s3 = s2.encode('GBK') --> 变成GBK,

type(s2) --> unicode

type(s3) --> str

这些都是py2里面的类型,unicode类型和str类型,

py3,文件默认是UTF-8,

  字符串是unicode(不变),

py2,文件默认编码是ASCII,

  字符串默认编码是ASCII,

  如果文件头声明是GBK,字符串就是GBK

  有个数据类型叫unicode

中文在UTF-8中是3个字节,GBK占2个字节,有时通过字节长度可以分辨出编码的方式。

最后的unicode的字节8def就可以查到“路”在unicode中的编码对应位,看到对应GBK的编码位置为G0-4237,

将8d转换成二进制码,然后去除头上一位,剩下的就是42

总而言之是一一对应的。

为什么呢?

因为ASCII中128位以后的字符很少使用,因此中文GBK把后面的128位利用起来,并规定128以上为高字节,128以下为低字节,如果2个128以上的高字节字符连在一起就是表示中文,否则表示英文。

内存里都是010101存,而用16进制显示是为了方便,其实还是二进制,

 

这个叫二进制串儿,叫bytes类型(即表示位置),而对应的“路飞”两个字是字符串(表示图形),在python3里面是一样的。

bytes == str

概念上不同,但是实际上是一样的。

那如何定义一个bytes呢,s2 = b"路飞",bytes就是字符串,那为什么要还有bytes类型呢,既然它就是str,

为什么相同呢,因为有编码表,所以根据bytes就找到了str(字形),但是图片是没有对应编码的,

因此为了表示图片、视频等等,有了bytes来表示图片,而不是字形,它是纯二进制,没有对应的字形,它有十六进制的码,但是如果print()它的话,python会尝试使用编码去寻找对应关系的字形,因此最后生成的就是乱码。

除了bytes和str外,python还有一个unicode类型,统称都叫字符串,s = u"路飞",这个就是unicode类型的字符串,是为了支持全球,

然后总体简单来说,字符串有3种,bytes、str、unicode三种,

这些都是python2!!!!!!!!!!!

在python2中,文件头以UTF-8,GBK。。。编码的代码,代码内容加载到内存,并不会被自动转换成unicode,依然是UTF-8,GBK。。。

在python3中,以UTF-8,GBK。。。编码的代码,代码内容加载到内存,就都会被自动转换成unicode,整体都是unicode,整个代码都是,

那样python3就默认就支持全球化了。

python3中依然可以写 s = u"路飞",但是事实上只有str一个类型了。

能不能正常展示,关于编码的原因就以下4个:

最后,千万别瞎转编码,转不回来!!!

猜你喜欢

转载自www.cnblogs.com/Jack1314/p/10331508.html