六、编码

编码:
ascii:
早期计算机都是用ascii编码,包含了所有的英文和特殊字符 以8位来存储一个字母(一个字节) 8位=1字节(8位是计算机二进制
只能以,01010100,八个数字进行存储)
如:H......01011011...一个字节,有2**8=256种可能性
unicode万国码,优点:能识别目前所有语言,解决早期ascii只能识别英文问题,总共32位,有2**32可能性,缺点:,占用空间,
耗用内存大

utf-8在万国码基础之上进行压缩,用8来占位,节省内存空间(中文是3字节)
如:H..... -- - - -- - - -- - - -01011011,前面空白区域就可以节省

gbk:能识别中文和英文(中文是二字节)

"""
1.运行程序的三个核心硬件
cpu
内存
硬盘

任何一个程序要想运算,必选先有硬盘加载到内存,然后cpu去内存取指执行
运行着的应用程序产生的数据 必先存在内存

2.python解释器运行一个py文件(xxx.py)步骤
1.将python解释器的代码由硬盘读到内存
2.将xxx.py以普通文本文件形式读到内存
3.python读取文件内容 识别python语法 执行相应操作
ps:普通的文本编辑器与python解释器前两步都是一样的

"""
# 字符编码

"""
字符编码针对的是文字
那也就意味着这里需要考虑 视频文件 音频文件等其他文件吗? 不需要
字符编码只跟文本文件有关


文本编辑器的输入和输出是两个过程

人在操作计算机的时候输入的是人能够看懂的字符
但是计算机只能识别010101这样的二进制数据,那么
输入的字符 >>>(字符编码表)>>> 二进制数字


字符编码表就是字符与数字的对应关系
a 0
b 1
a 00
b 01
c 11
d 10

ASCII码表
用八位二进制表示一个英文字符 所有的英文字符+符号最多也就在125位左右
0000 0000
1111 1111


GBK
用2Bytes表示一个中文字符 还是用1Bytes表示一个英文字符
0000 0000 0000 0000
1111 1111 1111 1111 最多能表示65535个字符

基于上面的推导步骤 任何一个国家要想让计算机支持本国语言都必须自己创建一个字符与数字的对应关系
日本人 shift
韩国人 fuck



万国码unicode
统一用2Bytes表示所有的字符
a 0000 0000 0010 1010

1.浪费存储空间
2.io次数增减,程序运行效率降低(致命)


当内存中的unicode编码格式数据存到硬盘的时候,会按照utf-8编码
unicode transformation format

会将unicode的英文字符由原来的2Bytes变成1Bytes
会将unicode中文字符由原来的2Bytes变成3Bytes




现在的计算机
内存都是unicode
硬盘都是utf-8



(需要掌握的)
unicode的两个特点
1.用户在输入的时候,无论输什么字符都能够兼容万国字符
2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系

(*****)
数据由内存保存到硬盘
1.内存中的unicode格式二进制数字 >>>>编码(encode)>>>>> utf-8格式的二进制数据

硬盘中的数据由硬盘读到内存
1.硬盘中的utf-8格式的二进制数据 >>>>>解码(decode)>>>>> 内存中unicode格式的二进制数据






(******)
保证不乱码在于
文本文件以什么编码编的就以什么编码解





python2
将py文件按照文本文件读入解释器中默认使用ASCII码(因为在开发python2解释器的unicode还没有盛行)
python3
将py文件按照文本文件读入解释器中默认使用utf-8

文件头
# coding:utf-8
1.因为所有的编码都支持英文字符,所以文件头才能够正常生效

基于Python解释器开发的软件,只要是中文,前面都需要加一个u
为了的就是讲python2(当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据)





python3中字符串默认就是unicode编码格式的二进制数





补充:
1.pycharm终端用的是utf-8格式
2.windows终端采用的是gbk

乱码:字符不能够正常显示      编码不一致

八位二进制也叫8bit(******)
8bit = 1Bytes
1024Bytes = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
....

x = '上'
res1 = x.encode('gbk') # 将unicode编码成可以存储和传输的utf-8的二进制数据
print(res1) # b'\xe4\xb8\x8a'
# bytes类型 字节串类型 你就把它当成二进制数据即可
res2 = res1.decode('gbk') # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据
print(res2)























































猜你喜欢

转载自www.cnblogs.com/wukai66/p/11140118.html