从ASCII到UTF

来源:互联网 发布:mac 刷机iphone 编辑:程序博客网 时间:2024/06/11 15:12

1,前言

计算机使用的是二进制,而人类却无法像计算机那样直接阅读二进制数据。人类怎么和计算机勾通呢?这就需要在人类的自然语言和计算机的二进制数据之间约定一种对应关系,这就是字符集编码。

 

2,ASCII码

ASCII码是英语和二进制数据的对应关系。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。因为,128=2^7 ,故ASCII是7位字符集。它是美国信息交换标准代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计。

比如,下列部分ASCII表:A的代码为97,在计算机的数据为1100000。 

 

代码字符代码字符代码字符代码字符0  32[空格]64@96`1 33!65A97a2 34"66B98b3 35#67C99c4 36$68D100d5 37%69E101e

 

3,ISO 8859-1 Latin 1(ISO Latin-1)编码

ASCII是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的欧洲文字时就会出现问题。因此,创建出了一些包括255个字符的由ASCII扩展的字符集。它把位于128-255之间的字符用于拉丁字母表中特殊语言字符的编码,也因此而得名。因为,256=2^8,故Latin是8位字符集。

 

4,ANSI 编码

欧洲语言不是地球上的唯一语言,因此亚洲和非洲语言并不能被8位字符集所支持。仅汉语(或pictograms)字母表就有80000以上个字符。为了支持不同的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。 比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。

 

5,UNICODE编码

Unicode也是一种字符编码方法,不过它是由国际组织设计,它是为了容纳全世界所有语言文字而设计出来的编码方案。Unicode的学名是"UniversalMultiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode CharacterSet"的缩写。前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,而GB码是BABA。 

 

6,UFT8编码

事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。目前存在的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, 以及 UTF-32。

 

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:1110011010110001 10001001,即E6 B1 89。

0 0