当面试被问到Unicode与UTF-8有什么区别你需要这样回答

时间:2022-10-21 15:42:20

本文参考:知乎,并结合自身开发经历撰写

背景:前几天师弟过来提及到面试的时候被提问到Unicode与UTF-8
有什么区别,师弟一时蒙蔽,突然之间脑袋里也是不知道两者的关系,只知道开发的时候只用万国码UTF-8,故百度一番,留下一个记录好好理清楚编码之间的关系。

为什么对编码问题最开始会觉得乱?

因为之前从开始学习java基础的时候看视频只是简单的提及到编码GBK(中国人定义的一套编码),但是后面学J2EE的时候就直接接触UTF-8,至此无论从浏览器到http传输协议,到编译器,再到底层数据库,反正只要有乱码那就知道是编码问题直接改配置成UTF-8就可以解决,解决了就不再深入探究,所以编码问题在实际的工作开发中只知其然,而不知其所以然。

那什么是编码?

谈及编码也是从《深入理解计算机系统》开始认识的。在计算机的世界只有1、0,所有的数据、所有的逻辑、所有的命令、都是用10的组合来表达,当然编码也是不例外。
一个单位1、或者是0用计算机术语来描述就是位(bit),一位代表1、或者0,比如两位可以形成4个组合,00,01,10,11。因为位的表示内容实在太小且不易区分,所以人们慢慢规定使用8位组合来作为计算机描述的基本单位,成为字节(Byte),再用字节或字节的组合来描述信息,如 0000 0001 表示XXX,0000 0002表示YYYY等。

计算机最开始是由美国人研发出来的,使用的是拉丁字母表示,外加一些特殊的符号,他们整理算起来大概有127个字符。计算机一个字节表示的信息量是 2∧8 = 256 个,所以美国人很显然的使用了一个字节来表示他们所使用的字符,规定了之后呢那需要一个字典来标注具体的字节表示什么字符,这时候就出现了Ascii 编码表,其中描述了比如:
0×10(0001 0000), 终端就换行;
0×07(0000 0111), 终端就向人们嘟嘟叫;
0x1b,(0001 1011) 打印机就打印反白的字,或者终端就用彩色显示字母。

因为一字节表示使用的是8位,也就是01010…等重复八次,所以人们在描述字节时习惯使用十六进制来描述。

随着时间发展,需要记录的字符也越来越多,显然127个字符已经不够用了,所以美国也对原来的Ascii 进行拓展,直接使用到了256个。

计算机传入中国

在中国就有三千多个汉字,单单一个字节的组合肯定不足以来描述那么多的内容,也不可能因为计算机让全中国的人都熟悉英语把?所以专家们就在原来的Ascii 的基础来加多一个字节,通过两个字节的组合(2∧16 = 65536)来描述中文的字符,因此定义了新的一套编码表“GB2312”,让中国人也可以让中国的字符顺利的在计算机系统内被描述。

最开始的”GB2312”只是描述了一些比较常用的,但是与美国一样随着计算机应用的复杂性,就的编码已经不能满足实际需求了,所以在“GB2312”的基础上又定义了“GBK”字符集,后来为了让少数民族的字符可以在计算机内描述,又拓展了“GB18030”。

计算机全球化

当互联网发展到全世界,每个国家都拥有自己的一套编码,比如(“简单举例,不是真的”)在中国使用的是2个字节0xbb12表示“我”,但是到了印度解码之后却成了乱码,且中国的计算机使用的是“GBK”,没法正确的输入印度的符号。所以为了适应全球化的问题出现了ISO组织,他们的出现就是为了解决全球国家计算机编码的统一。

ISO组织最开始的解决方案是提出了Unicode编码,Unicode编码与GBK编码类似,使用了2个字节来描述全球各个国家的字符,无论是什么字符都是用两个字节表示,中文也不例外,所以再一次,使用Unicode编码,一个中文(全角)等于两个字节。

在网络传输中,力求传输的内容简短可以减少网络流量,所以这就暴露出Unicode的一个问题,如果传一大段数据的内容都是英文字符的话,那导致两个字节其中的第一个字节表示都是 0000 00000,对空间、网络带宽是极度的浪费,所以ISO 由提出了另一个代替Unicode的编码,也就是UTF-8,UTF-8对每个字符没有固定的字节数限制,有的一个字节,有的占两个字节,有的占三个字节,要特别注意的是中文用UTF-8编码是占3个字节,这也与传统的编码不同,UTF-8用不同字节数来描述这其中涉及了一些算法,也不做 讨论,但是UTF-8的好处就是能做到的是最大程度的利用了计算机的空间,加快了网络的传输速率(当然了,如果传输都是中文的话,那GBK应该更省空间,但是有可能吗?)。