8位一个字节byte
开始计算机只在美国使用,2^8=256个足以包含一些符号和英文字符了
1968年提出ASCII码,分为三部分
第一部分是:ASCII控制字符; 范围0-31 终端,打印机等控制符号
第二部分是:ASCII打印字符; 范围32-127 空格,英文字符等(键盘上能找到的)
第三部分是:扩展ASCII打印字符。范围128-255 扩展字符集,新的字幕,符号,还有画表格时的横线,竖线,交叉等
待中国使用计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客 气地把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
1980年中国人民看到这样很不错,于是就把这种汉字方案叫做 "GB2312"。GB2312 是对 ASCII 的中文扩展。
后来又发现不够用,于是继续扩GB2312->GBK->GB18030
GB2312有6763个汉字,GBK有21003个汉字,GB18030-2000有27533个汉字,GB18030-2005有70244个汉字
然后就是各个国家都有自己的一套编码标准,互不兼容,怎么办
1990年这时一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题,他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它"Universal Multiple-Octet Coded Character Set",简称 UCS, 俗称 "UNICODE"。并于1994年正式公布。
Unicode 1.0:1991年10月
Unicode 2.0:1997年7月
Unicode 3.x:1999年9月;整合ISO 10646
Unicode 4.x:2003年4月
Unicode 5.0:2006年7月
Unicode 5.1:2008年4月
Unicode 5.2:2009年10月
Unicode 6.0:2010年10月
Unicode 6.1:2012年1月
Unicode 6.2:2012年9月
Unicode 6.3:2013年11月
在UNICODE 中,一个字符就是两个字节。可组合出2^16=65536个字符,这大概已经可以覆盖世界上所有文化的符号。如果还不够也没有关系,ISO已经准备 了UCS-4方案,说简单了就是四个字节来表示一个字符,这样我们就可以组合出2^31=21亿个不同的字符出来(最高位有其他用途),这大概可以用到银河联邦成立那一天吧!(现在unicode的指定范围为U+0000 to U+10FFFF,后面的那么多还待使用),需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,下面的UTF-8是Unicode的实现方式之一
UTF-8是一种针对Unicode的可变长度字符编码,采用8bit编码,字节数范围为1-6字节(中文一般都是3字节),也就是其可表达最多2^48个字符(尼玛,这得多大啊),尽管如此,2003年11月UTF-8被重新规范,只能使用原来Unicode定义的区域,即U+0000 to U+10FFFF,也就是说最多4位字节(实际可以表示的很长,但是这里给规定死了),我觉得UTF-8受欢迎的原因是变长这个特性,可节约空间
UTF-8解析时,对于UTF-8编码中的任意字节B
如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符;
如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不是字符的第一个字节编码,需要往前或后找到第一个字节;
如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示;
如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示;
如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示;
另附unicode与utf-8的转换:(大于4个字节的已给砍掉了)
Unicode和UTF-8之间的转换关系表:
UCS-4编码 UTF-8字节流U+00000000 – U+0000007F 0xxxxxxxU+00000080 – U+000007FF 110xxxxx 10xxxxxxU+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxxU+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxU+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxU+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
例如"汉"字的Unicode编码是6C49。6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码。
1