字符与编码笔记:字符和编码概述

随着社会的发展和时代的进步,现代人的生活几乎已经离不开电脑、手机等电子工具,拿它们看新闻、聊天、打游戏已经成为我们生活的一部分。每天只要出门没带手机,整个人就会变得浑浑噩噩,浑身不自在。

计算机:0和1的世界

然而,这些我们能识别的,形形色色的显示在电子设备上的信息,其在计算机内部都是由0和1来表示的。

正如用来存储信息的光盘,你知道它里面存有数据,但是光看它的外表也读不到任何的信息。

如果把盘片放在显微镜下,你或许可以看到盘片表面坑坑洼洼,凹凸不平,其中凸起的地方就表示1,凹下去的地方就表示0。

字符和编码

那这些0和1是怎样被我们认知的呢?这就要说到字符和编码。

字符

在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信息。比如英文字母“A”是一个字符,汉字“我”是一个字符,标点符号“/”也是个字符。

编码

把计算机中存储的0和1,转化为特定字符的一种映射关系,是一种约定。比如ASCII码中01000001表示A,01000010表示B。

字符和编码的发展

由于需要转化的字符不同,或者转化为相同字符的约定不同,衍生出了很多不同的字符集和编码。

从计算机对多国语言的支持角度来看,大致可以分为以下四个阶段:

阶段一:英语国家(ASCII码)

由于计算机是由英语国家发明的,所以在刚开始时,只支持英语,其他语言都不能够在计算机上显示。

ASCII码,是由美国人在上个世纪60年代制定的一套字符编码,将计算机中的二进制数据转化为英文字符。

ASCII码由一个字节的前7位表示,字节的最高位规定为0。于是它总共可以表示2的7次方,128个字符。比如大写字母A是65(二进制01000001)。

阶段二:欧洲国家(扩充ASCII码)

英语用128个字符就够了,但是对于很多非英语的欧洲国家来说,128个字符是不够的。比如,在法语中,字母上方有注音符号的,ASCII码就无法表示。

于是一些欧洲国家就决定,利用ASCII码中闲置的最高位来扩充编码,扩充后的编码总共可以表示256个字符,其中前128个字符和ASCII码一致,后128个字符的字节最高位均为1。

由于很多欧洲国家的字符不同,所以他们对ASCII码的扩充也不尽相同。比如130(二进制10000010)在法语编码中表示é,而在希伯来语编码中则表示ג。

阶段三:其他国家(ANSI码)

对于一般的欧洲国家来说,256个字符已经足够承载信息了。但是对于其他国家,特别是亚洲国家,比如说中国,历经了几千年的文明,积累了数以万计的字符,区区256个字符是完全不够的。

于是ANSI编码出现了,它特指为了使计算机能够支持更多的语言,使用2个字节来代表一个字符的编码方式,通常使用0x80~0xFF的范围。

不同国家和地区制定了不同的标准,因此,在不同的系统环境中,ANSI码表示的含义也不同。比如:

不同的ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI编码的文本中。

阶段四:所有国家(Unicode)

如前面三个阶段描述,世界上存在着多种编码方式。即使在ANSI编码下,在不同的系统环境中,也代表了不同的字符。

于是当你想打开某一文件的时候,就需要知道它的编码方式,否则就有可能出现乱码,常见的邮件系统,就是一个例子。

如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码,就不会出现乱码问题了。

这就是Unicode。

Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,“汉”这个字的Unicode编码是U+6C49。

Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。

于是为了提高Unicode的编码效率,出现了UTF-8、UTF-16等编码。

总结

本文主要概述了字符和编码的概念,计算机中的0和1是如何转化为我们日常可读的信息的,以及沿着字符发展顺序,各种编码方式出现和存在的原因。

存在即合理,事物不会凭空的产生,也不会无故的消失。虽然有些编码方式现在看来很不合理,但是在那个特定的时间节点,它却是最好的选择。

下期总结GBK和UTF相关,希望能够用烂笔头来成就真正的好记性。

参考资料

字符

字符编码

字符集和字符编码

字符编码笔记:ASCII,Unicode和UTF8

程序员必须知道的关于Unicode和字符集的一些事