首先,为什么要编码?

我们知道,计算机只能存储二进制串001100011....

如果要计算机存储一个数字7,计算机可以用00000111来表示

如果要存储'a'这个字符呢?肯定也用一个二进制串来表示字符a

这就是字符的编码,即将字符转化成二进制串的过程

那么相反的过程就是解码,即将二进制串转化为字符的过程

上面说到,用一个二进制串来表示字符a,那么具体用多少来表示a呢?

如果用01100001来表示字符a,这种映射方式就叫做ASIIC编码格式

ASIIC格式规定用一个字节来表示一个字符,也就是,最多之能表示256个字符

那么中文字符以及其他语言咋办呢?

unicode是另外一种编码方式,它规定最少用两个字节表示字符,也就是最少能表示65536个字符

这下,全世界语言是都能表示了

但是它在表示英文字母的时候也用两个字节,高字节都是00000000,显然很是浪费

于是出现了utf-8编码格式

它是对unicode的优化,对不同的情况进行了分类

如果是英文字母及常规符号用一个字节表示,中文字符用三个字节表示

可以发现,utf-8编码相对unicode编码在全是英文字符的情况下需要的二进制串可以减半

因此,在网络上传输或者文件存储的时候,都是用utf-8编码

python3中的str和bytes两种数据类型

python中的解码与编码分别由decode和encode两个模块实现

python(或者任何编程语言)中的编码如果没有指定编码格式的话,默认用的是unicode

因为任何运行在内存中的数据都是以unicode的方式编码的

此时如果对某个字符调用编码方法

则会返回该字符按照该编码格式对应的二进制结果,一般用十六进制显示

比如我在python中定义了变量a='a'

此时字符'a'在内存中是00000000 01010001,即0x61

执行a.encode()

返回值即是0x61

但对它进行unicode编码是没有意义的,为什么?

因为内存中本来存储的就是按照unicode编码的二进制串呀,这次编码操作只是为了用户查看它的编码结果而已

一般我们对一个字符编码无非是为了存储或者传输

而前面我们也了解了,unicode编码并不是存储和传输的最佳方式

一般我们会用utf-8进行编码

执行b=a.encode('utf-8')

则b为01010001,即0x61

将b存储到文件中,假设命名为test.txt

那么这个时候文件中的内容就是01010001,即0x61,就只有这么一个字节

也就是,下次你直接打开这个文件,并且读取文件中的内容

你会发现,得到的是完好无损的字符a

因为系统默认会对二进制串用unicode解码(任何加载到内存中的数据都是unicode格式)

而幸运的是对于字符a而言,unicode和utf-8两种格式的映射关系是一样的

如果保存的是中文字符,那么你大概率会得到一个乱码

那么如何得到正确的字符呢?

可以在读取的时候指定解码格式,比如

open("test.txt").read().decode("utf-8")

实际上,open("test.txt").read()的返回值是该字符按照该编码方式得到的二进制串

既然有二进制串这种数据,那么它肯定也属于某种数据类型

在python3中,我们把二进制串这种数据的类型称作bytes

而字符a的数据类型是str

str被编码后得到bytes,bytes是二进制串,能直接存储和传输

当然,如果直接打印bytes类型的数据的话,

我们也不会看到类似0101010001这样的结果,python会用0x61这样的十六进制表示方法来代替~

转载于:https://www.cnblogs.com/jiage666/p/9853786.html

python3中的编码与解码相关推荐

  1. 【Python笔记】Python 中的编码与解码

    本文记录 Python2.x 和 Python3.x 中关于编码和解码的问题. 文章目录 1. 一些基本的概念 2. 编码格式 3. 编码和解码 4. Python3 的默认编码 1. 一些基本的概念 ...

  2. Vue中base64编码和解码

    推荐一个不错的学习资料库 Vue中base64编码和解码 1.在项目更目录下执行命令,安装 npm install --save js-base64 2.在使用的项目引入 let Base64 = r ...

  3. Java中的编码与解码

    1. 基本概念: (1)字符集(Charset):是一个系统支持的所有字符的集合,包括各国家文字.标点符号.图形符号.数字等. (2)字符编码(Character Encoding):就是一套自然语言 ...

  4. python3 中的编码问题 unicode, utf-8, gbk, ascii

    1. ASCII是最早的字符集,总共包含127个字符,因为是美国人发明的,127个够他们用了. 2. GBK是ASCII的扩展集,ASCII使用一个字节,即8个二进制位,来表征英文字母和一些符号,一个 ...

  5. python3中字符串编码常见种类_Python基础篇—标准数据类型—String字符串编码问题...

    我要开始写String编码问题了...脑壳疼.. 在String字符串的第一篇末尾有留一个坑,就是关于中文字符串编码.整个编码的故事说起来都是很费劲的,我也只能把我所知道的梳理整理一下,在日常敲码过程 ...

  6. python编码解码的过程_使用Python过程中的编码和解码

    编码和解码的问题纠结了我很久了,对他一直只有是是而非的理解,好像是那么回事,但是又不懂,今天终于来认真解决一下这个问题,总结一下大神们的回答,做一下笔记. 首先,我们知道,计算机中的所有数据都以二进制 ...

  7. python中的编码和解码_Python中“is”和“==”之间的区别,以及编码和解码,与

    Python中'is'和'=='的区别,以及编码与解码 Python中'=='和'is'的区别 (1)Python中'==' Python中'==比较变量的值,如果值相同返回True,如果不同返回Fl ...

  8. Python 中的编码与解码

    转载来源:https://zhuanlan.zhihu.com/p/38293267 1.一些基本的概念 比特 / bit:计算机中最小的数据单位,是单个的二进制数值 0 或 1 字节 / byte: ...

  9. 如何理解遗传算法中的编码与解码?以二进制编码为例

    文章目录 前言 编码 解码 补充 前言 遗传算法的编码方法各种各样,但二进制串编码方式是最经典的一种,那么它的编码和解码该如何进行呢?或许本博客能给你一个具有参考价值的答案. 编码 经典遗传算法中使用 ...

最新文章

  1. 应用商店让云上电视落入人间
  2. mysql查询时给字段加内容,mysql数据库查询之对应库对应表中的注释信息查询以及加字段查询...
  3. 深入理解最大池化为什么能够实现不变性?
  4. System类、包装类、Math类、Random、Arrays工具类
  5. 告诉你银行在年底为存储做的小动作
  6. Java快速入门学习笔记9 | Java语言中的方法
  7. 时间格式化,常用时间,格式
  8. 陕西省2021年高考成绩位次查询,2021年陕西高考个人排名怎么查询,陕西高考成绩排名查询方法...
  9. 富士通大数据架构解决方案闪耀存储峰会
  10. Android进阶: 10分钟实现NDK-JNI 开发教程
  11. 使用 Nginx 编译 Sass 和 Scss
  12. 把CSV文件导入到MySQL数据库中
  13. C#版 微信无痕僵尸粉检测工具源码
  14. Oracle中rank函数详解
  15. Unity Shader 之 简单 护盾Shield 效果的实现
  16. 淘宝越来越重视的内容营销要怎么去做?
  17. java中文件读取方式的顺序_java中读取文件的方式
  18. verdaccio每次下载有时候不会加载taz压缩包原因解决
  19. 图像超分综述:超长文一网打尽图像超分的前世今生 (附核心代码)
  20. 信号完整性分析---串扰和反射

热门文章

  1. 将oracle select * from all_tab_comments where comments like ‘%XXXX%‘查询结果转为select语句
  2. Linux 设置windows可见的文件夹共享,创建只拥有读权限的共享用户,samba工具安装,“smbpasswd: command not found“问题解决
  3. 单片机编程之联合体(union)的妙用
  4. Java的Socket通信(多Clients/Server模型)
  5. Given an integer, write a function to determine if it is a power of two
  6. dhcp只能分配与路由器相同网段么_dhcp工作原理
  7. PageRank算法以及Python实现(简洁版)
  8. sklearn学习(一)
  9. Xgboost实现GPU加速
  10. 13.7 线程生命周期状态图、线程常用的方法。