Skip to content

字符编码

字符为什么需要编码

计算机中储存的信息都是二进制数,而我们在屏幕上看到的数字、英文、汉字等字符计算机是无法直接识别的,因此需要将字符信息转换为计算机能够识别的信息,这个过程就是字符编码。

想想如果没有使用字符编码会怎样? 计算机输出到屏幕的不是0就是1
111001001011110110100000 111001011010010110111101
请问这一串二进制你看得懂什么意思吗?

同样的,当你输入你好中文字符给计算机时,它同样读不懂,因为它的世界里只有01

这就尴尬了呀,你看不懂它,它读不懂你。这时字符编码就派上用场了,字符编码就好比人类和机器之间的翻译程序,把我们熟知的数字、英文、汉字翻译成机器能读懂的二进制,同时把二进制翻译成我们能看懂的字符。

计算机的世界

我们在计算机上看到的、听到的、写下的所有东西,包括文字、图片、音频、视频等,背后都是由一串二进制数组成的。
比如你看到的你好,计算机中储存的其实是
111001001011110110100000 111001011010010110111101
01这是对于软件层面来说的,对于计算机的硬件,我们是用什么表示01的呢?

机械硬盘,数据是通过磁极的方向来表示的,磁极向上或顺时针方向(例如,磁场朝向硬盘底部)通常被表示1。磁极向下或逆时针方向(例如,磁场朝向硬盘顶部)通常被表示 0

内存条,有一堆电容组。通电后,电容充电或电压高,则表示1;电容未充电或电容电压低,则表示0。内存断电后,电容会释放电荷,也就无法再存储数据了。

CPU,由晶一堆体管组成,高电平通常表示1,低电平表示0

二进制其实是我们抽象出来的数学逻辑概念,二进制只有两种状态,使用有两个稳定状态的物理器件就可以表示二进制中的每一位,例如用高低电平或电荷的正负性、灯的亮和灭都可以很方便地用01来表示,这为计算机实现逻辑运算和逻辑判断提供了便利条件。

显示器怎么显示成像的?

显示器就是一群发光二极管组成的矩阵,其中每一个二极管可以被称为一个像素,1表示亮,0表示灭,而我们平时能看到五彩的颜色,是把三种颜色(红绿蓝三原色)的发光二极管做到了一起。那对于一个ASCII编码65最后又怎么显示成A的呢?这就是显卡的功劳,显卡中存储了每一个字符的图形数据(也称字形码),将二维矩阵的图形数据传给显示器成像。

从混乱到统一

早期大厂商各干各个的,搞自己的硬件、软件,想怎么编码就怎么编码。后来机器间需要相互通信的时候,发现在不同计算机上显示出来的字符不一样,在 IBM 上00010100数字代表A,跑到微软系统上显示成了B。大家就傻眼了。于是美国的标准化组织就跑出来制定了ASCII编码 ,统一了游戏规则,规定了常用符号用哪些二进制数来表示。ASCII 码使用8位表示一个字符,所以最多能表示256个字符。

字符二进制
A0100 0001
B0100 0010
C0100 0011
D0100 0100
......

统一 ASCII 码标准对于英语国家很开心,但是 ASCII 编码只考虑了英文字母,后来计算机传到欧洲地区,法国人需要加个字母符号(如:é),德国人又需要加几个字母(Ä ä、Ö ö、Ü ü、ß),幸好 ASCII 只用了(0-127)个编号,于是欧洲人就将 ASCII 没用完的编码(128-255)为自己特有的符号编码,也能很好的一起玩耍。

但是等传到我们中国后,我们有几万个汉字,256个编号完全不够用啊,所以有了后来的多字节编码… 因此,各个国家都推出了本国语言的编码表,也就有了后来的 ISO 8859 系列、GB系列(GB2312、GBK、GB18030、GB13000)、Big5、EUC-KR、JIS … ,不过为了能在计算机系统中通用,这些扩展的编码均直接或间接兼容 ASCII 码

由于各个国家各搞各的字符编码,各大国际厂商在兼容各种字符编码问题上深受折磨,于是忍无可忍之下,决定开发一套能容纳全世界所有字符的编码,就有了后面大名鼎鼎的 Unicode

Unicode 也叫万国码,包括字符集、编码方案等,Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,在这种语言环境下,不会再有语言的编码冲突,在同屏下也可以显示任何国家语言的内容,这就是 Unicode 的最大好处。 在 Unicode 编码方案里常见的有四种编码实现方案 UTF-7、 UTF-8、UTF-16、UTF-32。