代码改变世界

图解编码基础

2012-01-12 18:46  海不是蓝  阅读(2217)  评论(11编辑  收藏  举报

远古时代:ascii

A long time ago,米国童鞋想打字了,于是就有了ascii码。

ascii码的一个字是8(一个字节,8个二进制),但是只用后7(0-127),

英语中一般的字符以及数字、字母;剩下最高位1比特被用作一些通讯系统的奇偶校验。

输出下ascii

for (byte i = 0; i <= 127; i++)

{

    Console.Write("{0}-0x{0:x}:{1}{2}", i, (char)i, (i + 1) % 4 == 0 ? "\n" : " ");

}

注意:0x0nul,代表结束标志'\0'。(修改:之前这里写的是NULL,多谢peerben童鞋的指出。)

 

可怕的事情发生了:OEM字符集的衍生

米国童鞋愤怒了:“我受够了每天都只能打这128个字符!不!是127个,第一个什么也不是。啊。。。你妹啊!”。

so!一些不乖的童鞋开始打歪主意了!

一个字节能够表示的数字(编号)有256个,而ASCII字符只用到了0x00~0x7F,也就是占用了前128个,后面128个数字不用白不用!

这些童鞋各自有各自的想法,这就导致了当时销往世界各地的机器上出现了大量各式各样的OEM字符集。

 

东方国度也开始用电脑啦:多字节字符集(MBCS)和中文字符集

时代在进步,东方的国度也开始用电脑了。

对于欧美国家的童鞋来说,也许ascii足够了,但是对于东方国度,这256个字符远远不够的。

但是东方的人民是无敌的!很快变发明了多字节编码方式。例如中国使用的就是双字节字符集编码。

 

继续进步!中国的汉字

中国童鞋们的汉字系统是博大精深,数量也是比26个字母多了不知道多少倍,但是一切困难在中国童鞋面前都是纸老虎!是纸老虎!

 

 

GB2312

用于简体中文,一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE

 

繁体古文怎么办?big5

用于繁体中文,

 

56个民族是一家!GBK1.0GB18030

GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。

2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030GB13000.120902个汉字的基础上增加了CJK扩展A6582个汉字(Unicode0x3400-0x4db5),一共收录了27484个汉字。

 

混乱的终结!Unicode

太多太多的编码了,慢慢的,全世界的童鞋们发现没有个统一的标准是没法发展进步的,

so!终结者Unicode出现了。

ISO组织的童鞋们对全球混乱的编码标准已经忍无可忍了,所以他们废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它"Universal Multiple-Octet Coded Character Set",简称 UCS, 俗称 "UNICODE"

Unicode2个字节的,简称为UCS。现在用的是UCS-2,即2个字节编码。2个字节最多能够表示65536个编码。

这样太少,所以出现了UCS-4, 4个字节编码,由原先的65536个编码扩展至将近100万编码。

 

UTF8UTF16UTF32

UTF,即Unicode Transformer Format,是Unicode代码点(code point)的实际表示方式,按其基本长度所用位数分为UTF-8/16/32。它也可以认为是一种特殊的外部数据编码,但能够与Unicode代码点做一一对应。

 

UTF-8是变长编码,每个Unicode代码点按照不同范围,可以有1-3字节的不同长度。

//UTF-8是压缩的Unicode编码方式.

 

UTF-16长度相对固定,只要不处理大于\U200000范围的字符,每个Unicode代码点使用16位即2字节表示,超出部分使用两个UTF-164字节表示。按照高低位字节顺序,又分为UTF-16BE/UTF-16LE

 

UTF-32长度始终固定,每个Unicode代码点使用32位即4字节表示。按照高低位字节顺序,又分为UTF-32BE/UTF-32LE