两位巨佬的一顿晚饭,整个互联网被改变了

2023-10-24 12:20

本文主要是介绍两位巨佬的一顿晚饭,整个互联网被改变了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1

1992年9月, 一个周三的下午,贝尔实验室。 

Rob Pike (Go语言发明人之一) 正在操作系统Plan 9 上忙碌,这是继Unix之后的一个大工程, 马上就要完工了,  这个时候他突然接到了一个电话。 

(年轻帅气的Rob Pike)

电话是IBM的人打来的,他们正在奥斯汀参加X/Open 委员会会议, 想请Rob Pike 和 Ken Thomson (Unix发明人) 对他们设计的一个Unicode编码进行评审。

Rob Pike知道X/Open委员会主要负责制定Unix上的标准规范,以便提高应用程序的在不同Unix变体上的移植性。

很明显,这一次会议的主题是:编码

Rob Pike想到了自己正在忙活的操作系统Plan 9 , 为了支持全世界的语言如英文、中文、韩文、日文、阿拉伯文...... Plan 9 当然要用Unicode 。 

(这货怎么和Go的吉祥物长得如此之像?)

大家都知道Unicode只是规定了每个字符用什么编码,但是没有规定如何去存储, 当时Plan 9 采用了一个叫做ISO 10646 UTF编码, 但是这个编码实在不怎么样, 按照Rob Pike的话说:我们恨这个编码。 

Rob 和 Ken 立刻意识到:机会来了 !

Rob :我们有丰富的经验, 为什么不设计一个真正好用的Unicode存储标准呢? 

Ken :同意, 我们设计出来,把标准推广的事情交给X/Open委员会。

俩人向IBM的人表达了这个想法, 得到了支持,条件是: 一定要快,快速设计、快速实现。 

因为下周一就要投票表决了!

对于天才程序员来说,快速、高质量把活儿搞定就是小菜一碟。

Ken :还记得《老婆离家三周,我开发了一个操作系统吗?》

他们俩慢悠悠地去餐厅吃饭,在吃饭期间,Ken 和 Rob就把基本的方案给设计出来了,这就是大名鼎鼎的UTF-8

回到贝尔实验室,他们就把想法写成了提纲,发给了X/Open 委员会的人, 委员会的回复是: 

这比我们设计的版本好多了,你们什么时候能实现它? 

Rob 和Ken 拍着胸脯说:放心吧,下周一肯定能有一个完整的、可以运行的实现。

当天晚上(周三),他们俩就卷起袖子干活, Ken 把packing和unpacking的代码搞定, Rob则去折腾C和图形库相关的东西。 

周四,所有的代码都已完成,开始将Plan 9操作系统上的文本文件转成UTF-8 

周五,Plan 9 操作系统就已经运行在UTF-8上面了。 

实际花费不到三天!

这三天的工作成果最终统治了整个互联网的编码标准, 统计显示, 现在96.8%的Web网站在使用UTF-8。 

2

故事讲完了,我们来看看为什么UTF-8能流行起来。 

前面说过Unicode只是一个字符集,它规定了每个字符的二进制代码,例如“码” , 对应的Unicode 是7801 , 二进制是

111 1000 0000 0001

需要两个字节来保存, 如果表示其他更大范围的字符,可能需要3个字节或者4个字节,甚至更多。 

当计算机面对这两个字节的字节流的时候,就会出现严重的问题:计算机怎么知道这两个字节表示的是一个字符?还是两个字符?

大家知道英文字母用一个字节保存就够了,如果Unicode规定每个英文字符也用两个字节或三个字节来保存,那每个英文字母前面势必要补上0, 文本文件要大两到三倍。 

这是巨大的浪费,肯定不行。 

Rob和Ken的设计的UTF-8就比较聪明, 看看这个表:

把Unicode 转换成UTF-8,非常简单,比如汉字“码” , Unicode 是7801 , 二进制是 111 1000 0000 0001

7801对应上图的第三行,只要把二进制从右向左填到对应的“模板”中就行,不够的补零

更多的细节就不展开了,关键要看看UTF-8有什么好处。

3

1. 兼容ASCII, 表格中的第一行就是为ASCII所设。 

多字节编码的每个字节的最高位永远是 1,而 ASCII 字符编码的最高位是 0,所以从根本上杜绝了编码冲突。

2. 第一个字节就指明了后续的长度

当程序面对一个字节流的时候,只需要读出第一个字节最前面有几个1 ,就知道这个字符的长度,解码很方便。

3. 前缀码

大家仔细观察下, UTF-8中没有任何合法字符是其他字符的前缀, 这样就带来了一个好处:支持程序快速地跳过有问题的字节,然后正常解码。

假设有两个中文 “码” 和 “农”, 对应的UTF-8编码为E7A081(码) and E5869C(农)。 

但是网络传输丢失了一些数据,变成了 E781 E5869C   (即“码”的A0丢失了)

现在程序先读到了E7, 二进制是 1110 0111,它就知道这个字符应该是3字节的, 并且后面的两个字节都应该以10 开头。 

于是它就要再读两个字节, 因为A0这个字节丢失了, 程序读到了81 和 E5。 

程序就发现: 

81 (二进制10000001) 是符合规范的

E5(二进制11100101)的开始两个bit不是10啊, 这应该是另外一个字符的开始。

所以程序就判断出有字符丢失了,可以丢弃刚读到的E7 81 , 然后从E5开始读取, E5 86 9C ,最终显示“农”字。

是不是很巧妙?

这篇关于两位巨佬的一顿晚饭,整个互联网被改变了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275116

相关文章

react笔记 8-18 事件 方法 定义方法 获取/改变数据 传值

1、定义方法并绑定 class News extends React.Component {constructor(props) {super(props)this.state = {msg:'home组件'}}run(){alert("我是一个run") //方法写在类中}render() {return (<div><h2>{this.state.msg}</h2><button onCli

互联网开发要点

垂直扩展 横向扩展 业务分拆 数据读写分离 缓存读写 异步处理(消息队列)

Java中四舍五入保留两位小数或不保留小数

//四舍五入,不保留小数; float gr = 8; float gc = 3; DecimalFormat df1 = new DecimalFormat("0");//格式化小数,不足的补0 String gaver = df1.format((gr/gc));//返回的是String类型的      //四舍五入,保留两位小数; float g1 = 111; f

【前端】animation动画以及利用vue制作简单的透明度改变动画,包含vue生命周期实现

一. 问题描述 想做一个文字透明度从1到0然后再从0到1的css动画。 二. 代码写法 2.1 animation写法 2.1.1 animation属性key 2.1.2 代码展示 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=de

HTML5如何成为改变移动互联网幕后的推手

在未来的某一天,我们打开手机,不再需要访问手机应用商店,不论是 Apple的还是Google的,我们只需要点击手机主菜单页面上的一个链接,手机就会立即在它的浏览器上启动一个 “应用程序”;再也不需要flash插件,就能欣赏华丽丽视频画面。   AD:2013云计算架构师峰会课程资料下载   2012年,说HTML5集千宠万爱于一身也毫不夸张,IE、Chrome、Firefox和Opera等

C/C++两点坐标求距离以及C++保留两位小数输出,秒了

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 3. 备注 1. 前言 依旧是带来一个练手的题目,目的就一个,方法千千万,通向终点的方式有很多种,没有谁与谁,我们都是为了成为更好的自己。 2. 正文 2.1 问题 题目描述: 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。 输入格式:

心觉:如何用一颗心改变世界和自己

关于如何开发自己的潜意识开发的底层逻辑和注意事项 我这里就不赘述了,可以看我前面的文章 今天主要讲一下,如何让我们祈祷的作用发挥到极致 这里提到了祈祷,其实就是正念 把自己的梦想,目标,愿望通过积极的语言 或者生动形象的画面告诉自己的潜意识 你的这些梦想,目标,愿望就会慢慢地变成现实 这是真的,有无数的案例可以证实 我这里就不举例子了,大家可以网上搜 我只讲一下,为什么有些人

输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。

/*** 输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。* 思路:第一步求这两个数的异或,第二步统计异或结果中1的位数*@author: Administrator*@date: 2017-1-13 下午09:39:25*/import java.util.Scanner;public class Solution4 {public int CountDifference

使用WMI改变显示器亮度

文章目录 前言使用WMI调节显示器亮度 前言 最近遇到了新的需求,需要通过代码去改变显示器的亮度。通过调研发现,改变显示器亮度的方式有三种 1.调节伽马值 2.使用WMI 3.使用DDC/CI协议 然而这三个方法都各有缺点: 第一个方式:调节伽马值,效果会收到显示器的影响,有的显示器,或者驱动,会去校准显示器亮度。如果你改变了伽马值,在你的鼠标脱离程序的时候,屏幕亮度就会被校准回