Python基础之编码
1、编码I
-
前提
我们计算机上看到的这些数据只要加载到内存他先是的就是中文、英文等我们可以读懂的数据。但是!只要将这些数据存储在磁盘上,或者通过网络发送出去,存储的和发送的是什么?理解为0101001这种二进制。
我带着阿珍穿越回到1937年,我是一名地下工作者,老党员。阿珍是被我转化的原日伪军,现我的线人。
我和阿珍要情报通信,我们如何进行情报传输?我们可以发送电报。假如,当时没有摩斯码电报。我们要制作电报,发送电报。我们要制作一个密码本。
比如,滴一声代表1,不滴代表0.
龟 01010 田 1100 过 11111 生 010101 日 001 # ------------------------- # 01010110011111010101001 # 如果密码本是上面这么做,我们能否成功翻译?不能,二进制没有规律,没有断句。改进,比如我们的二进制7位一断。
- 改进的七位一段
龟 0001010 田 0001100 过 0011111 生 0010101 日 0000001 # ------------------------- # 0001010 0001100 0011111 ..... # 回到我们的计算机上,计算机要存储数据到磁盘或者通过网络发出,需要转化成0101010二进制,而将数据读取到内存供人类识别使用, # 需要转化成文字,所以,计算机也是需要有一种密码本,密码本(编码本)存储的就是人类可以识别的文字与二进制01010的对应关系。
-
ASCII码
二进制最初设计是7位1段,7bit1bytes。为了以后的拓展,最终二进制是 8bit 1个bytes字节。单位转换。
a 0001010 7位 是128中不同的状态,可以表示128种不同的字符。
ASCII码是最早期的编码本,这个编码本存储的是英文字母、数字、特殊符号与二进制的对应关系。
规定的是:一个字符用一个字节表示。
msg = 'abE#@' 这个字符串一共是几个字符?5个字符。 如果用ASCII码进行编码,一共占5个字节。
所以ASCII码:
a 01100001 b 01100010 c 01100011 @ 01000000 ......
-
GBK系列
随着计算机在全世界的普及,各个国家都亟需拥有自己的国家的文字与二进制的对应关系的编码本。各个国家开始发展自己国家的编码本。GBK系列。每个国家都有自己独立的编码本GBK,包含自己的国家的文字与二进制的对应关系。
我们以中文为例:
# 我 0000 0010 # 如果是用一个字节8bit表示一个中文,最多可以表示256个中文。显然不够。 # GBK编码本做了一步拓展: # 一个中文字符---->用两个字节表示。 # 一个英文(数字、特殊符号)字符---->用一个字节表示。 # ------------------------- # a 00000000 01100001 两个字节 # 中 00000110 01100001 两个字节 # ------------------------- # GBK国标,当时每个国家都有自己国家的GBK编码,以中国为例: # 中国的GBK编码本包含:英文字母、数字、特殊符号、中文与二进制的对应关系。 # 一个中文字符用两个字节表示 一个英文(数字、特殊符号)字符 用一个字节表示。 # ------------------------- msg = 'ab小白@' # 一共几个字符?5个字符。 # 如果用GBK编码,共占7个字节。
-
unicode万国码。
我们要建立一个最大最全的编码本,将全世界所有的文字,都归纳到这个编码本中。起初,万国码两个字节表示一个字符,最终unicode采用4个字节表示一个字符。
# a 00000000 01100001 00000000 01100001 # 中 00011000 01100001 00000000 01100001 # の 00000000 01100001 00111100 01100001 # 这个unicode万国码虽然说将所有的文字都包含进去了,但是有问题的,对使用英文国家的人很不友好。 # 他们不用。为了解决这个问题,产生了utf-8编码本。
-
utf-8编码本。
对unicode编码进行了一个升级,最少用8bit一个字节表示一个字符。
# 英文,特殊字符、数字 一个字节表示1个字符。 # 欧洲文字 两个字节表示1个字符。 # 中文 三个字节表示个字符。 msg = '小白ba#$' # 一共几个字符? 6个字符。 # 如果用utf-8编码占10个字节。
-
单位转换
8bit = 1byte 1024byte = 1KB 1024KB = 1MB 1024MB = 1GB 1024GB = 1TB 1024TB = 1PB 1024PB = 1EB 1024EB = 1ZB 1024ZB = 1YB 1024YB = 1NB 1024NB = 1DB 常⽤到TB就够了
2、编码II
1. 在计算机的内存中,所有的数据统一使用unicode编码的文本序列,当需要将这些数据保存到磁盘上或者通过网络发送出去,必须要转化成非unicode的字节序列。
文本序列:人类能看懂的序列(python中所有的数据类型)都是文本序列。
字节序列:b1 = b'\xe4\xb8\xad\xe5\x9b\xbd' (底层就是010101011) bytes类型
2.不同的字节序列不能互选转化。
不同的字节序列之间是不能互相转化,必须中间依赖于unicode的文本序列。
我们以网络传输为例,我们做一个流程:
python的基础数据类型bytes
类名 | str类型 | bytes类型 | 标注 |
---|---|---|---|
名称 | str,字符串,文本序列 | bytes,字节序列 | 不同,可以通过文本文字或者字节文字加以区分 |
组成单位 | 字符 | 字节 | 不同 |
组成形式 | ‘’ 或者 “” 或者 ‘’’ ‘’’ 或者 “”" “”" | b’’ 或者 b"" 或者 b’‘’ ‘’’ 或者 b"“” “”" | 不同,bytes类型就是在引号前面+b(B)大小写都可以 |
表现形式 | 英文: ‘alex’ 中文: ‘中国’ | 英文:b’alex’中文:b’\xe4\xb8\xad\xe5\x9b\xbd’ | 字节文字对于ascii中的元素是可以直接显示的,但是非ascii码中的元素是以十六进制的形式表示的,不易看出。 |
编码方式 | Unicode | 可指定编码(除Unicode之外)比如UTF-8,GBK 等 | 不同 |
相应功能 | upper lower spllit 等等 | upper lower spllit 等等 | 几乎相同 |
转译 | 可在最前面加r进行转译 | 可在最前面加r进行转译 | 相同 |
重要用途 | python基础数据类型,用于存储少量的常用的数据 | 负责以二进制字节序列的形式记录所需记录的对象,至于该对象到底表示什么(比如到底是什么字符)则由相应的编码格式解码所决定。Python3中,bytes通常用于网络数据传输、二进制图片和文件的保存等等 | bytes就是用于数据存储和网络传输数据 |
更多 | … | … |
-
unicode文本序列转化成非unicode的字节序列
文本序列----> 字节序列过程叫做编码encode。
# msg = 'barry' msg = '中国' # unicode转化成非unicode bu = msg.encode('utf-8') # 编码 print(bu) # utf-8的字节序列 bu2 = msg.encode('gbk') print(bu2) # gbk的字节序列
-
非unicode的字节序列转化成unicode的文本序列。
字节序列 ------> 文本序列的过程叫做解码decode。
# b1 = b'\xe4\xb8\xad\xe5\x9b\xbd' # utf-8的字节序列 # 解码 # msg1 = b1.decode('utf-8') # print(msg1) b2 = b'\xd6\xd0\xb9\xfa' # gbk的字节序列 msg2 = b2.decode('gbk') print(msg2)
-
Utf-8的字节序列如何转化成gbk的字节序列。
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd' # utf-8的字节序列 # 先解码 msg = b1.decode('utf-8') # 在编码 b2 = msg.encode('gbk') print(b2) # b'\xd6\xd0\xb9\xfa'