远古时代: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" : " "); } 注意:0x0是null,不代表任何字符。 可怕的事情发生了: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.0和GB18030 GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。 2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉字的基础上增加了CJK扩展A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。 混乱的终结!Unicode 太多太多的编码了,慢慢的,全世界的童鞋们发现没有个统一的标准是没法发展进步的, so!终结者Unicode出现了。 ISO组织的童鞋们对全球混乱的编码标准已经忍无可忍了,所以他们废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它"Universal Multiple-Octet Coded Character Set",简称 UCS, 俗称 "UNICODE"。 Unicode是2个字节的,简称为UCS。现在用的是UCS-2,即2个字节编码。2个字节最多能够表示65536个编码。 这样太少,所以出现了UCS-4, 即4个字节编码,由原先的65536个编码扩展至将近100万编码。 UTF8,UTF16和UTF32 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-16即4字节表示。按照高低位字节顺序,又分为UTF-16BE/UTF-16LE。 UTF-32长度始终固定,每个Unicode代码点使用32位即4字节表示。按照高低位字节顺序,又分为UTF-32BE/UTF-32LE。 本文链接
|