本帖最后由 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 小写字母
这个规则对美国人民来说的确是够用了,但是随着计算机传到欧洲,西语系其它语种的国家发现在这个规则下,他们无法在计算机中使用自己本国的文字。
于是,ASCII 码从 7位 扩展到了 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 的基础上,众多面向传输的的 UTF(UCS 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 的出现,统一了编码规则,但是由于各种历史遗留问题,并不是所有的文件和系统都调整为这种编码,各种独特的编码方式还是有其存在与发展的市场。
于是这就给程序员们留下了编码与解码的日常工作......
|