目录

1.编码的历史

2.python 3.x中的bytes与str

3.编码的转换

正文开始

1.编码的历史与发展

1.1编码历史变更

  编码可以理解为谍战片中电报的密码本,如果要想让电脑识别要输入的文本,需要将文本转换为电脑能识别的机器语言

  由于发明计算机的是美国人,所以最开始的编码表就是美国人所设定,所设定的这个表就为ASCII码,ASCII码包含字母大小写、数字以及特殊符号。ASCII码使用8bit,一个字节表达一个字符,所以做多显示为2**8-1个字符,也就是255个字符,例如00000001        a

  后面由于计算机的广泛传播,ASCII码已经完全不能满足人们的日常需要,这个时候就出现了万国码,unicode,使用16bit,2个字节表示一个字符,后面使用后发现并不能实现,这个时候就进行了升级,此时采用32bit,也就是四个字节表示一个字符,虽然基本包含了所有的字符,但是,使用这种编码占用空间就很大;最终在后期的升级下,采用了现在大范围使用的UTF-8编码格式,对于英文以及传统的特殊字符采用ASCII编码,也就是8bit,一个字节,对于欧洲地区采用16bit,也就是2字节表示一个字符,对于亚洲区域则采用24bit,也就是三个字节显示一个字符。

  过于国内的字符编码,在unicode和utf-8没有大规模使用的期间,我国有自己的一套独立的编码格式,由最开始的GB2312到后面的GBK在到最新的GB18130,对于国内的编码的格式主要是,英文等传统特殊符号采用ASCII码就行,对于中文则采用16bit,也就是2字节表示,这样就造成不同国家不同的字符规格。

  实例

  'old男孩'在GBK中是7字节,在utf-8是9字节

  在python 2.7版本中,默认为ASCII码,不支持中文,如果需要输入中文必须在文首输入以下

  # -*- encoding:utf-8 -*-

  1.2进制的区别

  进制主要有二进制,八进制,十进制,十六进制

  二进制:只有01

  八进制:0-7

  十进制:0-9

  十六进制:0-E

   1.2.1二进制转十进制以及十进制转换二进制

二进制转化成十进制
1101 --->*2**7+0*2**6+1*2**5+0*2**4+1*2**3+1*2**2+0*2**1+1*2**0
1*2**5+1*2**3+1*2**2+1*2**0 = 32 + 8 + 4 + 1 = 45 十进制转化成二进制 : 对2取余,逆向排列
——-> 0010 1010

2.python3.x中的bytes与str

回到bytesstr的身上。bytes是一种比特流,它的存在形式是01010001110这种。我们无论是在写代码,还是阅读文章的过程中,肯定不会有人直接阅读这种比特流,它必须有一个编码方式,使得它变成有意义的比特流,而不是一堆晦涩难懂的01组合。因为编码方式的不同,对这个比特流的解读也会不同,对实际使用造成了很大的困扰。下面让我们看看Python是如何处理这一系列编码问题的:

>>> s = "中文"
>>> s
'中文'
>>> type(s)
<class 'str'>
>>> b = bytes(s, encoding='utf-8')
>>> b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> type(b)
<class 'bytes'>

从例子可以看出,s是个字符串类型。Python有个内置函数bytes()可以将字符串str类型转换成bytes类型,b实际上是一串01的组合,但为了在ide环境中让我们相对直观的观察,它被表现成了b'\xe4\xb8\xad\xe6\x96\x87'这种形式,开头的b表示这是一个bytes类型。\xe4是十六进制的表示方式,它占用1个字节的长度,因此”中文“被编码成utf-8后,我们可以数得出一共用了6个字节,每个汉字占用3个,这印证了上面的论述。在使用内置函数bytes()的时候,必须明确encoding的参数,不可省略。

我们都知道,字符串类str里有一个encode()方法,它是从字符串向比特流的编码过程。而bytes类型恰好有个decode()方法,它是从比特流向字符串解码的过程。除此之外,我们查看Python源码会发现bytesstr拥有几乎一模一样的方法列表,最大的区别就是encodedecode

从实质上来说,字符串在磁盘上的保存形式也是01的组合,也需要编码解码。

如果,上面的阐述还不能让你搞清楚两者的区别,那么记住下面两几句话:

  1. 在将字符串存入磁盘和从磁盘读取字符串的过程中,Python自动地帮你完成了编码和解码的工作,你不需要关心它的过程。

  2. 使用bytes类型,实质上是告诉Python,不需要它帮你自动地完成编码和解码的工作,而是用户自己手动进行,并指定编码格式。

  3. Python已经严格区分了bytesstr两种数据类型,你不能在需要bytes类型参数的时候使用str参数,反之亦然。这点在读写磁盘文件时容易碰到。

在bytes和str的互相转换过程中,实际就是编码解码的过程,必须显式地指定编码格式。

3.编码的转换

对于编码的转换,只需要记住下面这个图就好了

day4-python基础-编码相关的更多相关文章

  1. Python之路,Day4 - Python基础4 (new版)

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  2. Day4 - Python基础4 迭代器、装饰器、软件开发规范

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  3. Python 基础 编码

    Python 基础 编码 咱们的电脑,存储和发送文件,发送的是什么?电脑里面是不是有成千上万个二极管,亮的代表是1,不亮的代表是0,这样实际上电脑的存储和发送是不是都是010101啊 我们发送的内容都 ...

  4. Python基础-编码与解码

      一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简而言之,就是将人能够读懂的信息(通常称为明文)转换为计算机能够读懂的信息.众所周知,计算机能够读懂的 ...

  5. 【转】python基础-编码与解码

    [转自:https://www.cnblogs.com/OldJack/p/6658779.html] 一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简 ...

  6. Python之路,Day4 - Python基础(转载Alex)

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  7. python基础-编码_if条件判断

    一.第一句Python代码 在 /home/dev/ 目录下创建 hello.py 文件,内容如下: [root@python-3 scripts]# cat hello.py #!/usr/bin/ ...

  8. 不得不知道的Python字符串编码相关的知识

    开发经常会遇到各种字符串编码的问题,例如报错SyntaxError: Non-ASCII character 'ascii' codec can't encode characters in posi ...

  9. Day4 Python基础之数据类型(三)

    计算机中,一切皆为对象 世界万物,皆为对象,一切对象皆可分类 ------------------------------------我是分割线---------------------------- ...

随机推荐

  1. .NET应用程序管理服务AMS设计

    AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...

  2. 根据bootstrap框架实现移动端触摸滑动的方法

    有一个移动端的项目要求用jquery+bootstrap,其中有一个轮播图,需求是要求可以手触滑动,但是bootstrap中没有写手触滑动的方法,自己琢磨着写了出来,供大家参考. $(function ...

  3. SpringBoot入门教程(十六)@Autowired、@Inject、@Resource

    @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中.详情参见下表: v区别 ANNOTATION PACKAGE SOURCE 作用域 实现方 ...

  4. 带着萌新看springboot源码8(spring ioc源码 完)

    上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...

  5. 计蒜客:Entertainment Box

    Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fight ...

  6. 【Java基础】【16List集合】

    16.01_集合框架(去除ArrayList中重复字符串元素方式)(掌握) A:案例演示 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) 思路:创建新集合方式 /** * A:案 ...

  7. linux rsync 实际应用

    linux rsync 实际应用 一.rsync的概述 rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.rsync是Linux系统下的文件同步和 ...

  8. springboot情操陶冶-web配置(三)

    承接前文springboot情操陶冶-web配置(二),本文将在前文的基础上分析下mvc的相关应用 MVC简单例子 直接编写一个Controller层的代码,返回格式为json package com ...

  9. 好用的Chrome插件推荐

    无扩展,不 Chrome :几款 Chrome 扩展程序推荐 相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少用户的偏爱,但流畅只是一方面, Chrome 最大的优势还是其支持众多 ...

  10. 第18章 启动 - Identity Server 4 中文文档(v1.0.0)

    IdentityServer是中间件和服务的组合.所有配置都在您的启动类中完成. 18.1 配置服务 您可以通过调用以下方法将IdentityServer服务添加到DI系统: public void ...