【锟斤拷�⊠是怎样炼成的】——两分钟帮你彻底弄懂计算机的编码原理

简介: 【锟斤拷�⊠是怎样炼成的】——两分钟帮你彻底弄懂计算机的编码原理

✨编码原理

🌈基础概念

🌻1.字符
一个单独的字符,通常是字母、数字或符号。
字符可以通过计算机的字符编码系统来表示,例如 ASCII 编码、Unicode 编码等。
字符是计算机程序、文本文件、网页等的基本单位,在计算机中通常以字节的形式存储。
🌻2.字符集
一堆字符组成的集合叫做字符集。

字符和字符集电脑一个都不认识,计算机只认二进制,只能以比特的形式记录0和1,为了让计算机识字,就需要把这些字符用0和1表示出来。

🌻3.字符编码
把字符转换为0和1的规则就叫做字符编码。

🌈怎么将字符编码变成0和1呢?

可以选定一个字符集,让字符排在上面,就如下面这个表一样。

00 01 10 11
00 大 小 高 低
01 啊 哇 额 人
10 他 有 哦 是
11 等
码位
每个字符都有对应的码位(例如,上表中'有'的码位就是1001)。

码空间
每个字符所占位置就是码空间,码空间越大,字符集就越大。

🌈各种编码的形成过程

🍺ASCII码的形成

计算机存储数据的基本单位是字节(Byte),一个字节由8个二进制组成。也就是8个bit,每个bit分为0和1两种状态,8个bit一共有2^8个,也就是256种不同的状态。
所以如果只用一个字节长度来编码字符,也就是用8个0或者1来代表一个字的话,那么这个字符集就能容纳256个字符,听起来很少对不对?但对于英文来说就已经够了,因为他们只有26个英文字母嘛,所以在上世纪60年代,美国人先搞出来了美国信息交换标准代码,简称ASCII,ASCII总共收录了128个字符,包括大小写拉丁字母、数字、常用标点以及像ESC、换行这些看不见的控制字符。
到此为止,事情都很简单,无非就是给这128个字符按照顺序排号,再把序号转换为二进制数字,需要显示的时候,从计算机存储的ASCII字符集中按编号调用字符,就能在屏幕中显示出来了。

🍺ASCII的升级版EASCII

一个字符集对应一个编码规则,不会出错,一切都很清晰、简单、完美。但是这世上远远不止英文一种语言哇,当各国都进入信息化时代社会的时候,文字显示的乱纪元就开始了,上面说过,用一个字节编码字符最多能容纳256个码位。英文总共才那点字符,256个码位用完都还剩下一半。所以西欧一些国家就搞了扩展美国信息交换(EASCII),也就是用剩下的这128个空位来表示其他字符,比如有注音符号的的法语字母,西班牙语的特殊标点,数学上常用的α、β等希腊字母,以及一大堆特殊符号等等。
这时候问题就已经冒头了,各国搞定EASCII字符集和编码后面128字符都不太一样,一共搞出了200多种,互不兼容,就算是同样一串二进制数,在不同的EASCII中对应的字符也不同所以同一份文本,哪怕放到不同语言的计算机中打开,都可能出现乱码。

🍺写代码时汉字占两位的缘由

对于汉字源远流长,数量可太多了,我国1980年公布的GB 2312-80信息交换用汉字编码字符集 基本集就包含了6763个常用简体汉字以及一些标点、符号、数字、拉丁字母等。那很显然,一个字节长度最多只能编码256个字符,对于汉字来说根本不够用,所以GB 2312-80用两个字节来编码一个字符(这也就是为什么我们在写代码的时候汉字占两位),这样理论上就可以容纳2^16也就是65536个字符,现在输入法里的全角标点符号就是用两个字节编码的,而半角标点符号就是用一个字节编码的。

🍺框框—'▯'的形成

不过,GB 2312-80字符集里这六千多汉字,只是最常用的汉字,其实根本不够用,比如像喆、祎,这些人民中常见字甚至都不包括在内,那字符集里没有那个字怎么办呢?那就是打不出来,那些字就会变成'▯'。

🍺广为人知的GBK

日本用日本汉字,韩国用朝鲜汉字,大家都搞出了自己的字符集和编码规则,都优先考虑本地人使用方便,相互之间的兼容性很差,后来微软被逼急了,就根据各地字符集和字符编码自己扩展了GB 2312字符集,加入了一些繁体汉字,这份扩展的字符集,后来成为了汉字内码扩展规范GBK(国家扩展规范)。

🍺超级大的字符集——万国码(UNICODE)

我们搞一个超大字符集,囊括人类世界所有的字符,然后编码出来供全世界使用,不就解决字符集不互容的问题了,这个超级大的字符集,就是万国码(UNICODE)。Unicode决定以书写系统为标准来分类和收录字符,像英语、法语、德语都属于一套书写系统——拉丁字母,如今Unicode已经有了1114112个码位,并平均划分为17个平面,每个平面都有65536个码位,在单个平面上再根据具体的用途划分出区块,区块相当于把同类字符放在一起以方便检索和补充。UTF-8、UTF-16、UTF-32等都是把Unicode字符集中的字符转换成二进制信息的编码方式,目前最常用的就是UTF-8。纯文本文件:编码应使用UTF-8。
因为即使是同一串二进制数字在不同的字符集和编码方式下也会对于不同的字符,所以如果用错误的编码打开文本就会出现乱码。

有了上面的知识储备下面就回归本文最大的问题——锟斤拷�⊠是怎样炼成的?

🍺【锟斤拷】的形成过程

GBK和Unicode都有很多使用者,用GBK编写的字符用UTF-8打开就会无法正常显示,Unicode就会用这个替换字符�来展示所有无法展示显示的字符,如果此时再根据UTF-8编码保存,重新使用GBK编码打开,如果有两个�,那么EFBF BDEF BFBD这三个码位对应的就是【锟斤拷】三个字,也就是说两个�相当于一个【锟斤拷】,所以你在看下载的小说等等才会出现【锟斤拷】。
相关文章
|
XML Web App开发 存储
这个文件下载问题难住了我至少三位同事
这个文件下载问题难住了我至少三位同事
|
JSON 应用服务中间件 数据格式
杨洋撒撒一大片,Controller接收中文不再“不正经”,乱码问题这样解决,你信或不信
杨洋撒撒一大片,Controller接收中文不再“不正经”,乱码问题这样解决,你信或不信
130 0
杨洋撒撒一大片,Controller接收中文不再“不正经”,乱码问题这样解决,你信或不信
|
移动开发 JavaScript 前端开发
第03/90步《番外篇》第1章认识计算机世界第6课
今天学习《番外篇》第1章认识计算机世界的第6课,认识网页开发基础概念。这是这一章的最后1课,学完它代表概念准备阶段完成。
81 0
|
设计模式 JavaScript 前端开发
第02/90步《番外篇》第1章认识计算机世界第5课
今天学习《番外篇》第1章认识计算机世界的第5课,认识面向对象有关的基本概念。
71 0
|
存储 机器学习/深度学习 算法
大逆不道,从天界偷下来的算法修仙秘籍竟然传到你手上~~(结尾有彩蛋)
这有可能是你见过最离谱的标题 这有可能是你没见过的技术文章模式 我不知道我的选择是否正确,但是我的想法就是: 不再让技术冷冰冰,让所有人学习中获得快乐!
274 1
|
存储 自然语言处理 算法
算法系统学习-轻轻‘撬’开算法的入门
该系列是基于有一定语言基础(C,C++,Java等等)和基本的数据结构基础进行的算法学习专栏,如果觉得有点吃力 😥 ,建议先了解前提知识再学习喔!本个专栏会将用更容易理解的表达去学习算法,如果在一些表述上存在问题还请各位多多指点
218 0
|
存储 机器学习/深度学习 算法
只要你认真看完一万字☀️Linux操作系统基础知识☀️分分钟钟都吊打面试官《❤️记得收藏❤️》
只要你认真看完一万字☀️Linux操作系统基础知识☀️分分钟钟都吊打面试官《❤️记得收藏❤️》
239 0
|
机器学习/深度学习 存储 算法
【苏州程序大白用2万字】解析数据结构和八大排序算法☀️《❤️记得收藏❤️》
【苏州程序大白用2万字】解析数据结构和八大排序算法☀️《❤️记得收藏❤️》
114 0
【苏州程序大白用2万字】解析数据结构和八大排序算法☀️《❤️记得收藏❤️》
|
安全 Java 调度
多线程从入门到入坟(面试吹牛逼专用)
提高程序执行效率,比如多线程读取、写入文档等等(摊牌了,我生产中没用过,但这不妨碍我吹牛逼);
154 0
多线程从入门到入坟(面试吹牛逼专用)