每个开发人员都应知道的字符编码知识

2021-03-16 15:14:09 浏览数 (1)

转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 部分原文出处:https://www.freecodecamp.org/news/everything-you-need-to-know-about-encoding/

这篇文章里,我会向大家简要的介绍编码相关的历史,同时还会通过介绍部分计算机科学理论的基础来帮助更好的理解编码知识。

编码介绍及历史

我们都知道计算机只能理解二进制数据暨0和1,二进制是计算机语言,这是因为计算机在设计之初是由八个晶体管通过开合来表示数据的,于是这八位二进制数据被称为“字节”,一个字节根据八位的不同组合共有256种不同的结果。

在计算机启用之初,由于只在美国本土使用,所以开发者通过256个编码制定了ASCII标准,ASCII是将二进制字符对应到大小写字母、数字和常用符号的映射关系表,表如下:

我们可以看到,这张表里只用到了128就能完整表示出所有英语文字的方案了,而128-255位被定义为了扩展字符集,留作日后用来扩展使用,例如用来表示如:边框、圆角、西文等字符,以下是第一批IBM计算机使用的ASCII的128-255编码映射关系。

但随着计算机的不断普及,国内和其他的一些国家也开始使用电脑,为了能在计算机上使用自己的文字, 很多国家选择在127-255扩展定义自己的文字。

我们国内也一样扩展了自己的映射表,但我们的常用汉字数量还是远远大于这个阈值的储存能力,于是我们定义在中文字符编码格式下,两个字节表示一个汉字。于是在当时各个国家都有自己一套独特的扩展编码标准,以至于导致计算机在当时显示不同国家的字符时经常会出现乱码。

类似下面这样

Unicode的统一

互联网是将世界各地计算机连接起来的途径,如果能通过一套标准为每种语言中的每个字符都设定统一且唯一对应的编码,那么世界上所有的文字都能正常显示出来,而不用为了显示某种文字而频繁切换codepage。

���当然���如果就是���想显示֎֏0590成这样׃ׅׄ׆ׇ除外֐��。

于是ISO国际组织于1994年正式推出了Unicode标准(又称万国码、统一码)。之所以能统一,是因为Unicode规定了,所有字符统一由两个字节来表示,也就是16位。原先的英文字符、数字和半角符号虽然原先在ASCII中只用8位就能表现,但需要扩充为16位的话必须在高位补0, 如下示例:

1 – 00000001 – 00000000 00000001

可以看到,通过增长位数来扩展支持更多的语种这样的方式很不错,但在纯英文环境下由于没有用的补零高位会导致文本占用大量的存储空间,而这一情况在互联网时代的到来变得更加明显。

于是为了解决英文Unicode在网络传输时带来的低效问题,UTF协议也随之而来。

Unicode 转换协议 (UTF)

UTF是我们对Unicode码点进行编码的一种方式。UTF编码是由Unicode标准定义的,能够对我们需要的每一个Unicode码点进行编码。

但是UTF标准有不同的类型。它们分为UTF-8、UTF-16和UTF-32,而其中在互联网中最常用的就是UTF-8,在HTML5中也被置顶位新文档的默认编码。

下图中你可以看到,从2012年开始,UTF-8相较其他字符集的受欢迎度越来越高。

什么是UTF-8,它的工作原理是什么?

UTF-8是一种可变长的编码方式,理论上可达6个字节,但已现行文字和符号看,4个字节是已经足够了。

UTF-8以 8位(即 1个字节)为单元对原始Unicode码进行编码,规定:多字节码(2个字节以上)以转换后第1个字节起头的连续“1”的数目(这些连续“1”称为标记位),表示转换成几个字节:“110”连续两个“1”,表示转换结果为2个字节,“1110”表示3个字节,而“11110”则表示4个字节……跟随在标记位之后的“0”,其作用是分隔标记位和字符码位。第2~第4个字节的起头两个位固定设置为“10”,也作为标记,剩下的6个位才做为字符码位使用。这样,2字节UTF-8码剩下11个字符码位,可用以转换0080~07FF的原始字符码,3字节剩下16个字符码位,可用以转换0800~FFFF的原始字符码,由此类推。编码方式的模板如下:

代码语言:javascript复制
Unicode符号范围(十六进制)  |   UTF-8编码方式(二进制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

编码使用的位数取决于语言,一般来讲,英文会被编码为1个字节,欧洲(拉丁),希伯来语和阿拉伯语用2个字节表示。中文,日文,韩文和其他亚洲字符使用3个字节。你可能发现了,原本为了解决占用过长的问题,但实际编码后中文长度变为了3字节,如果你的客户都是国内用户,使用GBK能部分提高网页内文本的传输效率。

编码声明方式

看起来正确声明编码类型很重要,那么,我们该如何指定编码呢?

只需在<head>中的meta声明使用的字符集即可,如下:

代码语言:javascript复制
<html lang="en">
<head>
  <meta charset="utf-8">
</head>

除了以上方式外,我们还可以从HTTP请求/响应的Content-Type表头中声明。

最后总结

以上就是关于编码的一些简单的介绍,除了列举出的编码外,还有很多其他更多类型的编码,如果大家对其他的内容有补充,欢迎通过留言告诉我。  

0 人点赞