Crossin的编程教室

标题: 字符编码起源与发展 [打印本页]

作者: AAA    时间: 2017-3-17 16:27
标题: 字符编码起源与发展
本帖最后由 AAA 于 2017-3-17 16:35 编辑

字符编码起源与发展

总所周知,计算机的底层架构中开关的闭合、电容电平的高低决定了计算机是用二进制数“0”和“1”(学名:bit;中文名:比特)组合成的代码来控制的,一种组合指示计算机进行一种操作。
初期的计算机“0”、“1”的组合规则各异,可能甲造的计算机中二进制组合“1011”(学名:byte;中文名:字节)表示数学数字“11”(学名:character;中文名:字符),而乙造的计算机中却表示字母“a”。这显然不利于行业的交流与发展。
随着计算机的使用者越来越多,人们越发迫切地希望能有一个统一的标准出现。
于是,1968年,《美国标准信息交换码》(简称 ASCII)应运而生。
这个标准最初决定使用 7(bit)二进制数组成一个字节(byte),共128 个组合。包含了英文的大小写字母、数字、标点符号等常用的字符,数字代号从 0 至 127;

ASCII 的表示内容如下:

0 – 31           控制符号
32                 空格
33-47            常用符号
48-57            数字
58-64            符号
65-90            大写字母
91-96            符号
97-127          小写字母

这个规则对美国人民来说的确是够用了,但是随着计算机传到欧洲,西语系其它语种的国家发现在这个规则下,他们无法在计算机中使用自己本国的文字。
于是,ASCII7 扩展到了 8 ,从128 到255这一页的字符集则被称“扩展字符集”;

不过这点扩展显然完全无法囊括世界上千万种文化的字符,于是那些有需求的国家开始自己制定规则,许许多多的不同的新规则相继出现,如:

常用日语编码标准有 Shift_JIS、EUC-JP 等;
常用韩语编码标准有 ks_c_5601-1987、EUC_KR 等;
常用俄语编码标准有 KOI8-R 、 Windows-1251 等;

我们国家自然也有着自己的编码规则,常用的有:

GB2312:简体中文编码;
BIG5:繁体中文编码;
GBK:支持简体及繁体中文;

这样一来,字符编码仿佛又回到了原始蛮荒时代,各种规则间难以交流、转换。
这时候,国际标准化组织(ISO)站了出来,着手制定一种可以将世界上所有的符号都纳入其中的编码规则。这种规则被叫作”Universal Multiple-Octet Coded Character Set”,简称 UCS, 又称 unicode.
Unicode字符码是32位,4个字节,2^32 有多大呢,假设中华上下5000年,每两分钟创造一个字符,到现在也没造完 2^32 个!
然而,Unicode 还是有缺陷的。

对,它太大了!

平常使用的字符里,99%以上的字符都不会突破2个字节,西语系甚至只需保留的 ASCII (仅一个字节)就够了,显然使用Unicode 码会对资源造成极大的浪费。作为数据存储格式勉强能接受,数据传播也采用4个字节的方式的话,传播效率就太过低效了。

于是乎,Unicode 推广受阻。

再后来,Internet 诞生了,这种全球互联的通信网络迫切地需要一套统一的、更实用的编码规则。
终于,在 Unicode 的基础上,众多面向传输的的 UTFUCS Transfer Format)标准出现了。

其中最常见的是 UTF-8 标准,它的编码规则很简单:
1)如果一个字节的第一位是0,则这个字节单独就是一个字符;
2)如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。


下表总结了编码规则,字母x表示可用编码的位。

单字节编码:0xxxxxxx
双字节编码:110xxxxx 10xxxxxx
三字节编码:1110xxxx 10xxxxxx 10xxxxxx
四字节编码:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8 编码兼顾了 Unicode 的完整性与网络传输的效率,现已成为网络传输的通用编码规则。很可惜的是,虽然 UTF-8 的出现,统一了编码规则,但是由于各种历史遗留问题,并不是所有的文件和系统都调整为这种编码,各种独特的编码方式还是有其存在与发展的市场。

于是这就给程序员们留下了编码与解码的日常工作......






欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5