点击上方蓝色小字,关注“涛哥聊Python

重磅干货,第一时间送达

来源:数据分析与统计学之美

问题起源

我们在学习Python的过程中,可能会经常遇到下方这样的编码问题。

有时候我们需要选择gbk,有时候需要选择utf-8。你以为这样就完了吗?我们碰到的还有gb2312gb18030等各种奇奇怪怪的编码。

那么,编码的起源究竟是怎样的呢?我们今天就用“讲故事”的方式,带你认识一下它。

烽火士兵的故事

在正式讲故事之前,我们先来看一下下方这张图,我们暂且称其为《烽火士兵》的故事。

这一串数字,从右朝左看

那么这个故事究竟是怎么与编码问题扯上联系的呢?接着听我讲故事。

1个烽火都不点,表示有零个士兵;只点燃第1个烽火,就表示有一个士兵;在点燃第2个烽火的时候,熄灭第1个烽火,就表示有二个士兵;同时点燃2个烽火,就表示有三个士兵。

综上所述:2根烽火,可以表示:0、1、2、3个士兵,即1+2。3根烽火,可以表示:0、1、2、3、4、5、6、7个士兵,即1+2+4。依此类推下去…

通过上面的叙述,你可能已经发现了,这不就是类似计算机里面的二进制数字吗?只有0和1,0表示熄灭烽火,1表示点燃烽火。对应到计算机中就是,0表示关,1表示开。

下面黄同学就带着大家说一下“计算机中的0和1”

计算机中的0和1

计算机的底层是电路,只认识0和1,就是你初中物理中所谓的“电路”,0表示关,1表示开,没有别的玩意儿。但是你想呀,一个电路只有0和1的话,怎么展示出这绚丽多彩的世界呢?

因此,聪明的老外,把日常所用的文字和符号,编码成0101010…类型,这样电脑就能够表示文字了。所以,先记住一个关键语:“用什么编码,就用什么解码”

由于计算机是由美国人发明的,因此,最早的计算机编码:ASCII码(也是服务于美国人的),里面只有美国人日常所用的26个英文字母、数字、标点等常用字符,所以,最早的计算机也只有英文、数字、标点等特殊字符。(PS:不要惊叹为啥只有美国人常用的英文字母和符号,因为老美当时就没有想过计算机会迅速在全世界普及开来,谁也不能提前预知未来。)

接着我们来说说最早的计算机编码:ASCII码。

ASCII码占8个比特位,也就是一个字节,其中最前面一个位是扩展位,都是0,为了日后扩展所用,其余位置不是0就是1。这是由于计算机对数字7不敏感,熟悉2、4、8、16、32...等数字,所以扩展了一位,成了8位。

那么根据排列组合的知识,ASCII码可以表示2^7=128个码位,即可以表示128种不同的符号,其实这些符号已经够美国人使用了。这就是当时最早的计算机编码(ASCII码),这就是当时老美的打算。

计算机在中国的发展

随着计算机在世界各地的发展,我们发现原有的码位已经不够存放多国的文字和符号了,为了讲清楚这件事儿,我们以计算机在中国的发展为例,进行说明。

通过前面的叙述,我们已经知道最早的字符编码ASCII码中,并没有中文,但是随着计算机在中国的普及,我们必须要让计算机中能够表示中文呀,怎么办呢?

基于此,中国北大方正团队,发明了:gbk编码

但是这些字符肯定不能直接往ASCII码里面放,因为ASCII只有8位,最多才有2^8=256个空位,存放九万多汉字,显然不可能(就连中文中常用的3000汉字,也存放不了)。

所以在gbk中,汉字用2个字节表示,变成了ASCII码中字节长度的2倍,即gbk占16位,共2^16=65536个空位,这个对于存放常用汉字多得多,但是仍然不能将所有汉字存放进去,谁让中华文化源远流长,博大精深呢。

说到gbk,就不得不说它的兄弟姐妹了(如图所示):

其实它们是一个系列,都是由于当时的需要,逐步衍生出来的。这三种不同的编码都是向上兼容的。

可以看出:GB18030表示的字符数最多,这也就是为什么有时候使用Python读取Excel表时,使用GB2312和GBK都不行,而必须使用GB18030的原因了。

计算机如何兼容多国语言

计算机不仅在中国发展开来,其实计算机是在全世界迅速发展开来。如果说中国有自己独有的GBK编码,那么韩国、日本肯定也有它们自己独有的编码。

但是当今是“经济全球化”的时代,任何一个国家都不可能单独发展。假如你有一个国际合作的业务,我们在中国写的代码,要是想拿到国外去用,出现乱码,这样多尴尬?那么这个问题最终是怎么解决的呢?

为此,美国人又发明了一个叫做“Unicode”的东西,又叫做“万国码”。其实完全可以见名知意,万国码万国码,肯定是为了包含全世界的字符编码!

那么什么是万国码呢?接着听黄同学给你讲。

我们知道:计算机扩展一般是成倍增加的,要么是1个字节、2个字节、4个字节......。

最开始的Unicode,又叫ucs-2,ASCII存储采用1个字节,因此ucs-2采用2个字节进行存储,最多有2^16=65536个空位,这样仍然无法兼容全世界的字符。

于是ucs-4产生了,存储采用4个字节,共2^32=4亿多个空位。但是据统计,全世界文字、数字、符号信息加起来也就23万,对于4亿多空间来说,ucs-4简直太浪费空间了,这个对于文件传输来说,极其浪费流量。

考虑到节省空间,在Unicode基础上,我们又发明了utf-8,一种可变长的Unicode字符编码

Utf-8,对于英文来说,采用ASCII码占位方式,占8位,即1个字节;存放欧洲文字时,占16位,即2个字节;存放中文时,占24位,即3个字节。虽然对于中文来说很浪费空间,但是为了能把全世界文字都统一起来,又为了节省空间,采用这种方式,已经很好了(因为毕竟不可能做到面面俱到,谁让中国字符最多,会吃亏一点)。

实战演练

下面带着大家写写代码,认识一下字符编码。

(1)关于Python2和Python3的区别

在Python2中,默认字符编码是ASCII码,因此在Python2中写中文,首行一般都会加上-- coding:utf-8 --,看了这篇文章,我想你对这个东西已经有了一个清楚的认识。但是Python2现在已经停止更新了,我们了解即可,不用太关注。

对于Python3.x来说,默认字符编码是utf-8,而utf-8是Unicode的扩展集,即Python3.x中默认所有的字符都是Unicode。说白点,我们在Python3.x中随便写点啥,编码就是Unicode编码。

对比Python2和Python3:

# 在Python2中如果要表示Unicode编码,应该这样写。
my_name = u"黄伟"
# 在Python3中如果要表示Unicode编码,应该这样写。
my_name = "黄伟"

说到这里,我们可以下一个结论:不同编码之间的转换,都要经过一个Unicode

(2)encode编码和decode解码

>>> name1 = "我是你们的teacher老师"
>>> name2 = "你们是我的student学生"
>>> # 将name1编码为“utf-8”
>>> name1_encode = name1.encode("utf-8")
>>> name1_encode
b'\xe6\x88\x91\xe6\x98\xaf\xe4\xbd\xa0\xe4\xbb\xac\xe7\x9a\x84teacher\xe8\x80\x81\xe5\xb8\x88'
>>> # 将name1_encode解码还原
>>> name1_encode.decode("utf-8")
'我是你们的teacher老师'
---------------------------------------------------------
>>> # 将name2编码为“gbk”
>>> name2_encode = name2.encode("gbk")
>>> name2_encode
b'\xc4\xe3\xc3\xc7\xca\xc7\xce\xd2\xb5\xc4student\xd1\xa7\xc9\xfa'
>>> # 将name2_encode解码还原
>>> name2_encode.decode("gbk")
'你们是我的student学生'
-------------------------------------------------
>>> # name1_encode此时是“utf-8”编码,如果用“gbk”解码,会出现什么?
>>> name1_encode.decode("gbk")
'鎴戞槸浣犱滑鐨則eacher鑰佸笀'
# 上面就是我们常说的乱码、乱码、乱码!

代码分析:从代码中可以看出,如果是utf-8编码,每个中文字符就是3个字节存储。如果是gbk编码,每个中文字符就是2个字节存储。

编码知识总结

(1)字符编码发展史:

(2)以小写字母a为例,来说明字符编码。

-END-

今天给大家整理了关于 Python 资源最全的中文合集!

这个开源是由 vinta 发起维护的 Python 资源列表,内容包括:

1 Web 框架网络爬虫

2 网络内容提取

3 模板引擎

4 数据库

5 数据可视化

6 图片处理

7 文本处理

8 自然语言处理

9 机器学习

10 日志

11 代码分析

最难得可贵的是该资源,还有人专门持续更新。

项目的详细内容如下:

(可上下滑动查看全部资源)

资料获取方法

1. 扫描下方二维码

2. 后台回复关键词:开源

????长按上方二维码 2 秒
回复「开源」即可获取资料

各种奇奇怪怪的编码,究竟怎么来的?相关推荐

  1. 奇奇怪怪的大佬:从职业赌徒到互联网大佬

    想必上个月花季少女命丧货拉拉的新闻大家都有所耳闻,虽然事后警方已经给出了最终分析结果,但是货拉拉司机途中曾三次偏离导航规划路线.车内无任何录音录像设备.少女跳窗为何后脑勺着地等耐人寻味的话题,一时间将 ...

  2. 鼻纹、静脉、虹膜……奇奇怪怪的生物识别技术有哪些?

    现在,假设你养了一只狗,你们如胶似漆,交情过硬.那么,给你二十张同品种小狗的鼻子照片,你能一下子找出你的爱犬吗? 你可能要花费一段时间,也可能经受不住考验.不过,现在有能迅速分辨出你的爱犬的技术:鼻纹 ...

  3. 奇奇怪怪的小姿势——关于UI的各种Position

    奇奇怪怪的小姿势--关于UI的各种Position LocalPosition     重心点相对于父节点重心点的偏移量 AnchoredPosition   重心点相对于父节点锚点的偏移量 Posi ...

  4. C. 奇奇怪怪的魔法阵(未搞懂)

    C. 奇奇怪怪的魔法阵 题意: n个点m条边,定义集合S为独立集,当且仅当任意x,y∈S,x与y之间没有边.空集也是独立集 现在对于每一个点的集合T,有多少子集为独立集 设N=0,1,-,n-1,AT ...

  5. Vue组件库 View UI 来看看这80种奇奇怪怪的按钮

    80种奇奇怪怪的按钮,先睹为快! 本文详细讲解 View UI 中,Button 组件的样式配置和单击事件响应. 目录 一.按钮样式 1.1 颜色 1.2 大小 1.3 按钮形状 1.4 背景透明 1 ...

  6. 除了菊纹识别,AI还有哪些奇奇怪怪的识别能力?

    对于AI技术来说,我们人体简直就是一个大数据的宝藏. 最近发表在<自然·生物医学工程>杂志上的"斯坦福智能马桶",成为人们热议的"最有味道"的AI应 ...

  7. 对比学习知识扩展——一堆奇奇怪怪的loss,快把我压死了orz...

    1.交叉熵loss和对比loss区别 交叉熵 loss 是 最后结果过一层 fc 然后进行 softmax . 然后  fc  的系数 W 就是特征的模板(模板的意思是把一些特征用这个Wc参数转换后, ...

  8. 牢骚:各种奇奇怪怪的问题。。。

    最近总是遇到各种奇奇怪怪的问题,很郁闷 Android 2.1真机(手机)在创建一系列对象时(比如游戏里的一块石头,一朵花,一个人物之类的),最后一个被创建的总是无法正常显示,一出来就是看不到的,但是 ...

  9. delphi里面奇奇怪怪的函数真多。。

    这两天作东西的时候碰到一个问题,要分析一长串用逗号分割的字符串,于是我是这么写的 TFindRec = record     Sourcedata: string;     Sign: integer ...

最新文章

  1. U3D的Collider
  2. 首先请与所有现有链接到该网络共享的映射断开连接_嘉兴快速路环线时代来了!这12张主城楼盘片区地图,请收好...
  3. java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?
  4. wxml报错原因_C#生成、解析xml文件以及处理报错原因
  5. Android SharedPreferences总结及优化
  6. android代码shell命令申请权限,如何授予Android Shell用户更多权限?
  7. SpringBoot2.x 同个文件的加载顺序,静态资源文件
  8. FFmpeg开发(一)常用处理视频命令
  9. yolov3gpu配置_YOLO3-WIN10-GPU版配置详细教程
  10. PHP幸运抽奖系统带后台源码
  11. 加拿大高中计算机课,全面解析加拿大高中课程
  12. 最详细农行招聘面试经历
  13. mysql 之 增删改查
  14. linux hci0 进程,教程 - 在 Azure Stack HCI 上的 AKS 中部署 Linux 应用程序 - AKS-HCI | Microsoft Docs...
  15. 模电_第七章_正弦波振荡电路
  16. 软件开发生命周期(SDLC) 【详解】(含公司产品研发流程图、大厂研发架构图、大厂研发流程图)
  17. 如何入门漏洞挖掘,以及提高自己的挖掘能力
  18. python3 字符和数字(ASC码)转换
  19. RAP2-DELOS 开源社区版本 (后端API服务器) 部署安装
  20. python中的魔方方法

热门文章

  1. Python 3 集合方法 copy( )
  2. 解决win11能使用微信qq但是不可以使用浏览器上网的问题
  3. Let's Encrypt申请证书及使用
  4. 干货 | 在线查你的个人数据有没有泄露
  5. easyui combotree组件添加搜索功能
  6. 从零开始社区之路,手把手教你开源自己的Python包
  7. 数字化转型避无可避,PCB行业如何借力采购管理平台“乘风破浪”
  8. 美团点评暑期实习个人总结
  9. SQL Server中替换函数stuff、replace的使用
  10. Android-APK瘦身实践:二次瘦身如何再减少大小?,2021年安卓开发进阶课程