各种奇奇怪怪的编码,究竟怎么来的?
点击上方蓝色小字,关注“涛哥聊Python”
重磅干货,第一时间送达
来源:数据分析与统计学之美
问题起源
我们在学习Python的过程中,可能会经常遇到下方这样的编码问题。
有时候我们需要选择gbk,有时候需要选择utf-8。你以为这样就完了吗?我们碰到的还有gb2312、gb18030等各种奇奇怪怪的编码。
那么,编码的起源究竟是怎样的呢?我们今天就用“讲故事”的方式,带你认识一下它。
烽火士兵的故事
在正式讲故事之前,我们先来看一下下方这张图,我们暂且称其为《烽火士兵》的故事。
那么这个故事究竟是怎么与编码问题扯上联系的呢?接着听我讲故事。
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 秒
回复「开源」即可获取资料
各种奇奇怪怪的编码,究竟怎么来的?相关推荐
- 奇奇怪怪的大佬:从职业赌徒到互联网大佬
想必上个月花季少女命丧货拉拉的新闻大家都有所耳闻,虽然事后警方已经给出了最终分析结果,但是货拉拉司机途中曾三次偏离导航规划路线.车内无任何录音录像设备.少女跳窗为何后脑勺着地等耐人寻味的话题,一时间将 ...
- 鼻纹、静脉、虹膜……奇奇怪怪的生物识别技术有哪些?
现在,假设你养了一只狗,你们如胶似漆,交情过硬.那么,给你二十张同品种小狗的鼻子照片,你能一下子找出你的爱犬吗? 你可能要花费一段时间,也可能经受不住考验.不过,现在有能迅速分辨出你的爱犬的技术:鼻纹 ...
- 奇奇怪怪的小姿势——关于UI的各种Position
奇奇怪怪的小姿势--关于UI的各种Position LocalPosition 重心点相对于父节点重心点的偏移量 AnchoredPosition 重心点相对于父节点锚点的偏移量 Posi ...
- C. 奇奇怪怪的魔法阵(未搞懂)
C. 奇奇怪怪的魔法阵 题意: n个点m条边,定义集合S为独立集,当且仅当任意x,y∈S,x与y之间没有边.空集也是独立集 现在对于每一个点的集合T,有多少子集为独立集 设N=0,1,-,n-1,AT ...
- Vue组件库 View UI 来看看这80种奇奇怪怪的按钮
80种奇奇怪怪的按钮,先睹为快! 本文详细讲解 View UI 中,Button 组件的样式配置和单击事件响应. 目录 一.按钮样式 1.1 颜色 1.2 大小 1.3 按钮形状 1.4 背景透明 1 ...
- 除了菊纹识别,AI还有哪些奇奇怪怪的识别能力?
对于AI技术来说,我们人体简直就是一个大数据的宝藏. 最近发表在<自然·生物医学工程>杂志上的"斯坦福智能马桶",成为人们热议的"最有味道"的AI应 ...
- 对比学习知识扩展——一堆奇奇怪怪的loss,快把我压死了orz...
1.交叉熵loss和对比loss区别 交叉熵 loss 是 最后结果过一层 fc 然后进行 softmax . 然后 fc 的系数 W 就是特征的模板(模板的意思是把一些特征用这个Wc参数转换后, ...
- 牢骚:各种奇奇怪怪的问题。。。
最近总是遇到各种奇奇怪怪的问题,很郁闷 Android 2.1真机(手机)在创建一系列对象时(比如游戏里的一块石头,一朵花,一个人物之类的),最后一个被创建的总是无法正常显示,一出来就是看不到的,但是 ...
- delphi里面奇奇怪怪的函数真多。。
这两天作东西的时候碰到一个问题,要分析一长串用逗号分割的字符串,于是我是这么写的 TFindRec = record Sourcedata: string; Sign: integer ...
最新文章
- U3D的Collider
- 首先请与所有现有链接到该网络共享的映射断开连接_嘉兴快速路环线时代来了!这12张主城楼盘片区地图,请收好...
- java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?
- wxml报错原因_C#生成、解析xml文件以及处理报错原因
- Android SharedPreferences总结及优化
- android代码shell命令申请权限,如何授予Android Shell用户更多权限?
- SpringBoot2.x 同个文件的加载顺序,静态资源文件
- FFmpeg开发(一)常用处理视频命令
- yolov3gpu配置_YOLO3-WIN10-GPU版配置详细教程
- PHP幸运抽奖系统带后台源码
- 加拿大高中计算机课,全面解析加拿大高中课程
- 最详细农行招聘面试经历
- mysql 之 增删改查
- linux hci0 进程,教程 - 在 Azure Stack HCI 上的 AKS 中部署 Linux 应用程序 - AKS-HCI | Microsoft Docs...
- 模电_第七章_正弦波振荡电路
- 软件开发生命周期(SDLC) 【详解】(含公司产品研发流程图、大厂研发架构图、大厂研发流程图)
- 如何入门漏洞挖掘,以及提高自己的挖掘能力
- python3 字符和数字(ASC码)转换
- RAP2-DELOS 开源社区版本 (后端API服务器) 部署安装
- python中的魔方方法
热门文章
- Python 3 集合方法 copy( )
- 解决win11能使用微信qq但是不可以使用浏览器上网的问题
- Let's Encrypt申请证书及使用
- 干货 | 在线查你的个人数据有没有泄露
- easyui combotree组件添加搜索功能
- 从零开始社区之路,手把手教你开源自己的Python包
- 数字化转型避无可避,PCB行业如何借力采购管理平台“乘风破浪”
- 美团点评暑期实习个人总结
- SQL Server中替换函数stuff、replace的使用
- Android-APK瘦身实践:二次瘦身如何再减少大小?,2021年安卓开发进阶课程