Python基础之编码

本文介绍了计算机中字符编码的基本概念,从ASCII码开始,讲解了GBK编码和Unicode万国码。重点讨论了UTF-8编码的优势,它是如何处理不同语言字符的,并通过实例展示了编码和解码的过程。此外,还提到了字节序列和文本序列之间的转换规则及其重要性。
摘要由CSDN通过智能技术生成

Python基础之编码

1、编码I

  • 前提

    我们计算机上看到的这些数据只要加载到内存他先是的就是中文、英文等我们可以读懂的数据。但是!只要将这些数据存储在磁盘上,或者通过网络发送出去,存储的和发送的是什么?理解为0101001这种二进制。

    我带着阿珍穿越回到1937年,我是一名地下工作者,老党员。阿珍是被我转化的原日伪军,现我的线人。

    我和阿珍要情报通信,我们如何进行情报传输?我们可以发送电报。假如,当时没有摩斯码电报。我们要制作电报,发送电报。我们要制作一个密码本。

    比如,滴一声代表1,不滴代表0.

    01010110011111010101001
    
    # -------------------------
    
    # 01010110011111010101001
    # 如果密码本是上面这么做,我们能否成功翻译?不能,二进制没有规律,没有断句。改进,比如我们的二进制7位一断。
    
    • 改进的七位一段
    00010100001100001111100101010000001
    
    # -------------------------
    
    # 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'
    

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值