微智科技网
您的当前位置:首页每个程序员的都应该了解的字符编码

每个程序员的都应该了解的字符编码

来源:微智科技网
作者:科言君
链接:https://www.zhihu.com/question/20152853/answer/95576659
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

在开发过程中,字符编码始终是程序猿和程序媛们绕不开的一个话题。这里简要整理下有关字符编码的知识,供列位看官茶余饭后消遣:)

本回答尽量直观地介绍相关概念,不纠缠相关规定的细节,以使读者能对字符编码有着更直观的理解。当然,这样很容易挂一漏万,难免出现纰漏,也望各位批评指正。

众所周知,在计算机的世界,所有的信息都是0/1组合的二进制序列,计算机是无法直接识别和存储字符的。因此,字符必须经过编码才能被计算机处理。字符编码是计算机技术的基础,也是程序猿/媛需要的基本功之一。

在展开具体介绍之前,首先要强调一下几个概念,这对理解字符编码非常重要,也将贯穿在后文的介绍之中:

1) 
理解字符集字符编码的区别

2) 
“系统/终端/文件/程序”不同概念上的编码

3) 
常见操作系统、文本编辑器对字符编码的处理


1 、字符集与字符编码

如前所述,字符只有按照一定规则编码,最终表示为0/1二进制序列的形式,才能被计算机处理。那么,怎么定义这种编码映射呢?其实很简单,只要大家都按照相同的规则,规定好字符与二进制序列(表现为某个数值)之间的对应关系即可。比如,我们规定英语大写字母A对应数字65,那么我们只要将65的二进制形式()保存即可。

那么,问题又来了。如果大家使用的规则不一致怎么办,那岂不全乱套了?这时候,字符集就粉墨登场了。所谓字符集,直观上讲,就是人们统计预先规定好的一系列字符与二进制序列(数字)之间的映射关系。只要大家都遵循这个规则,并且计算机也按照这种方式处理,那么这个世界不就很美好了!然而,全世界的语言实在太多了,由于历史和地域的原因,也就形成了多套应用于不同场合、语言的字符集,如ASCII、GBK、Unicode等。

需要注意的是,我们规定好了字符与数字之间的对应关系,但这并不代表计算机一定要按照字符对应的数字将数字本身直接存储!有时候,我们按照一定的规则,将字符的码元再次处理,以更加适应计算机存储、网络传输的需要。字符编码便是规定了如何编码、存储这些字符对应的二进制序列。

因此,某种意义上,可以理解为,字符集是一种协议,而字符编码是对字符集的一种实现。当然,既然称之为“实现”,也说明对同一种字符集可能有不同的编码方式。可以想到,最直接的编码方式,便是直接使用字符对应的二进制序列,这就导致了字符集和字符编码看起来像是一个东东,长期受此思维影响,可能就会对Unicode和UTF的区别有些困惑。


2 、祖先:ASCII编码

再次回顾,在计算机内部,所有的信息最终都表示为一个二进制的序列。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256(2^8)种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态可以对应一个符号,就是256个符号,从0000_0000到1111_1111。

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定,这就是ASCII(American Standard Code for Information Interchange,美国信息交换标准代码),一直沿用至今。

ASCII码一共规定了128个字符的编码,包含常见的英语字符和一些控制符号。比如空格(Space)对应32(二进制0010_0000),大写字母A对应65(二进制0100_0001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0,没有使用。

需要强调的是,ASCII便是字符集与字符编码相同的情况,直接将字符对应的8位二进制数作为最终形式存储。因此,当我们提及ASCII,既表示了一种字符集,也代表了一种字符编码,即常说的“ASCII编码”。

ASCII表如下图所示。

<img src="https://i-blog.csdnimg.cn/blog_migrate/ea51e0c5f7a36620fd8fefee823995.png" data-rawwidth="535" data-rawheight="377" class="origin_image zh-lightbox-thumb" width="535" data-original="https://pic1.zhimg.com/bd3b6c7e4f432b6dfbf5838f8e62cd14_r.png">

因篇幅问题不能全部显示,请点此查看更多更全内容