Python_基础_编码

1.什么是编码
首先,将一段文字视为一个消息,这个消息是以人类可以理解的存在。这种消息又可以称为“明文”;
对于说英文的人,打印的或纸张上的英文单词都算作明文。
其次,计算机中存储的编码文本并不是我们可以看懂的明文,那么可以将编码文本转换为明文的过程称之为“解码”,
将明文转化为计算机中的编码文本的过程称之为“编码”

①.ASCII
计算机中所有的数据,文字、图片、视频又或是音频,本质上最终都是按照类似01010101的二进制存储的,也就是说计算机只懂二进制。
一个字节只有八位 A–>00010001 其中的一个 0 称之为 一个电平,也就是说八个电平作为一组表示一个字节;
八个电平做为一组就可以表示出256种不同状态 所以除了表示英文字符、一些特殊字符和数字外,还可以表示拉丁文。

②GB2312
我党人员的壮举,自力更生,将小于127的字符的意义与原来相同(表示英文及一些特殊字符和数字),两个大于127的字符连接在一起即表示一个汉字;前面的一个字节称为高字节(从0xA1用到0xF7)后面的一个字节称为低字节(0xA1到0xFE)。Gb2312是对ASCII的中文扩展.
但是汉字太多了,GB2312也不够用,于是规定:只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

③UNICODE
很多其它国家都搞出自己的编码标准,彼此间却相互不支持。这就带来了很多问题。于是,国际标谁化组织为了统一编码:提出了标准编码准则:UNICODE 。
UNICODE是用两个字节来表示为一个字符,它总共可以组合出65535不同的字符,这足以覆盖世界上所有符号(包括甲骨文)
④utf8
老外对于国际这顶的 UNICODE编码不服,我只需要一个字节干嘛要兼容别人用两个字节
所以发明了UTF-8(8-bit Unicode Transformation Format) 它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,所以是兼容ASCII编码的
但是在内存中的存储 都是以UNICODE编码方式存储的,但是在数据保存到磁盘或是在网络传输时,使用utf8要比unicode节省很多空间。

关于Unicode与utf8的关系:
Unicode是内存编码表示方案(是规范),而UTF是如何保存和传输Unicode的方案(是实现)这也是UTF与Unicode的区别。

s="I'm 帅哥"
# unicode
I      00000000 01001001
'      00000000 00100111
m      00000000 01101101
       00000000 0010000010000010 1101000101100110 00001010

这个字符串总共占用了12个字节,英文的前9为都是0!

#utf8
I    01001001
'    00100111
m    01101101
     0010000011101000 10001011 1001000111100110 10011000 10001010

utf8用了10个字节,因为我们程序的英文远多于中文,所以空间提升会很多。(节省硬盘空间及流量)
2.Python3编码

import json
a = "帅哥"
print(type(a)) #<class 'str'>
print(json.dumps(a)) #"\u5e05\u54e5"

b = a.encode('utf8') # 编码(encode)
print(type(b)) #<class 'bytes'>
print(b) #b'\xe5\xb8\x85\xe5\x93\xa5'

c = b.decode('utf8') # 解码(decode)
print(type(c)) #<class 'str'>
print(c)#帅哥
print(json.dumps(c)) #"\u5e05\u54e5"

Python3 对文本和二进制数据做了类型的区分,不会对bytes字节串进行自动解码,也不会以任意隐式的方式混用str和bytes.

3.从磁盘到内存的编码
当我们使用任意一款编译器时,编辑的文字或是英文等,在未保存之前都是以unicode编码方式存在的(万国码,世界上的任何字符它都有唯一编码对应,所以兼容性是最好的),
当我们保存后,其存入磁盘后,是以某种编码方式存在的bytes字节串,如utf8编码、gbk编码;
当我们打开这个文件时,编译器自动的将数据解码为unicode,然后就可以呈现给用户了;

同理,Pycharm也是一款编译器,计算机本身的操作系统也具备编译器的功能。
py2默认ASCII码,py3默认的utf8
所以会出现py2解释器去执行一个utf8编码的文件,就会以默认地ASCII去解码utf8,一旦程序中有中文,自然就解码错误了,所以我们在文件开头位置声明 #coding:utf8,其实就是告诉解释器,你不要以默认的编码方式去解码这个文件,而是以utf8来解码。而py3的解释器因为默认utf8编码,所以就方便很多了。

4.常见问题
①:cmd下乱码问题
当我们创建一个py文件 在电脑终端编译执行时
在win系统下,python2按照utf8去编码及保存的,但是当输出中含有中文,win中的cmd.exe编译器默认是是按照GBK方式来解码的,就是说在cmd.exe显示打印时 会出现问题,本身的文件执行并没有问题。
py3传递出的显示内容是以unicode数据编码的,所以显示没有问题。
②:open中的编码问题

# hello文本 :舞舞喳喳
f=open('hello')
print(f.read())

在win下会发生乱码,在linux下结果正常,也是因为win系统安装时时默认GBK编码的,而linux是utf8编码;
当win打开并按照GBK编码去解码utf8文件时 自然会乱码。

f= open('hello',encoding= 'utf8')
pint(f.read())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章