二进制换算等级
8bit = 1Bytes 1024Bytes = 1KB 1024KB = 1MB 1024MB = 1GB 1024GB = 1TB 1024TB = 1PB
字符编码发展史
字符编码表
ASCII码 只有英文字母和符号与数字的对应关系
用8位二进制(1bytes)表示一个英文字符
GBK:中文 英文 符号与数字对应关系
用2bytes表示一个中文符号 兼容英文字符
shift:日国
euck:韩国
unicode:万国码
utf-8:
各个编码特点
ASCII:表达数量有限 但单位体积小
GBK:在ASCII码基础上添加了更多的中文文字的表达二进制,但单位体积增大
unicode:在各个国家自己的编码的基础上规定了16个bit就是2字节来表示各国的文字,每个国家的文字对应unicode都有一个对应的关系表,缺点字母体积翻倍,不利于纯属和减慢了1倍的传输效率.
utf-8:在unicode的基础上更加灵活,字母为1个字节,中文为3个字节等等.虽然中文变3个字节,但是总体的效率依然是比gbk更高,所以还是以utf-8为主流编码格式
编码解码的python方法
res1 = bytes(x,encoding='utf-8') print(res1,type(res1)) res2 = str(res1,encoding='utf-8') print(res2,type(res2)) res = x.encode('utf-8') print(type(res)) print(res.decode('utf-8'))
保证不乱码的核心:
当初以什么编码存的(encode) 就以什么编码取(decode)
文件头
# coding:编码格式 列入: # coding:utf-8 美化点可以写成这样: # -*- coding:utf-8 -*-
识别python代码问题
如果不指定文件头 中文没法存储 那是因为python2解释器识别语法存储数据的时候默认使用的是ASCII 如果指定了文件头 python2解释器识别语法存储数据的时候使用文件头指定的编码 python2中通常都会在中文的字符串前面加一个u x = u'上' 告诉python2解释器将上存成unicode的形式
而python3 将py文件按照文本文件读入解释器中默认使用utf-8
python诞生之时,unicode并未像今天这样普及,很明显,好的东西你能看得见,龟叔早就看见了,龟叔在python3中将str直接存成unicode,我们定义一个str,无需加u前缀,就是一个unicode
个人设立的一个编码解码的情境
设立使用者电脑为window系统为例子.
以python2X为例:
第一步: 我写在屏幕上的数据是gbk,但是运行的时候Python2解释器的原因会把这些数据包括字符串都转化为ascii ,其他都以通过unicode的编码表自动转化为unicode,但是字符串无能为力,因为该字符串为ASCII存储,设立我的字符串为中文,那ASCII码没有正确的表达方式来表达我的这个字符串 这个时候就出现了储存问题.
第二步: 之后因为我的电脑是windows,windows默认的编码方式为gbk,这个时候存储的文件编码格式也为为gbk,
第三步: 然后通过windows终端调用python2来执行这个代码它的默认编码为gbk,相关代码会以gbk解码,转化成unicode到内存中
问题1: windows上执行其他不会出问题,但是字符串汉字就出现了乱码.
解决这种情况方法, 在第一步的读取代码的时候就需要设置对应读取编码的文件头 这边的 对应读取 对应的是写在屏幕上的文件内容转化到内存这过程 比如这边设置gbk 那么之后的文件在windows上执行就不会出现问题