首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

浅谈字符编码(2)- 常见编码

2012-08-07 
浅谈字符编码(二)- 常见编码·ASCII和ISO 8859-1·ISO 8859-1就比较简单了,我们知道ASCII码是从0x00到0x7F,

浅谈字符编码(二)- 常见编码
·ASCII和ISO 8859-1
            ·ISO 8859-1就比较简单了,我们知道ASCII码是从0x00到0x7F,也就是还有1位没有用到,ISO 8859-1就是在空置的0xA0-0xFF的范围内,加入192个字母及符号,藉以供使用变音符号的拉丁字母语言使用。所以ISO 8859-1又称Latin-1。

·GB2312、GBK和 GB18030
            ·简单来讲,这三者是这样一个关系:GB2312扩展便成了GBK,GBK扩展便成了GB18030。后者都对前者兼容。
            ·GB2312:
        ·采用2个字节。简体字的编码规范,也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个
            ·GBK:
        ·采用了2个字节。GB2312明显收录的汉字不够,于是增加了大量不常用汉字,还加入了几乎所有的Big5中的繁体汉字之后便成了GBK。
            ·GB18030:
        ·与前两者不同,采用了变长的编码方式,有1、2、4个字节的编码长度。
            ·1个字节编码与ASCII兼容
            ·2个字节编码与GBK兼容
            ·4个字节主要是收录了少数民族的文字等。
        ·GB18030诞生的原因类似于GBK,就是增加了大量的汉字,多收录了藏文、蒙文、维吾尔文等主要的少数民族文字。 GB18030现在是国家非手持/非嵌入式设备的强制性标准。
        ·但是GB18030与前者不同的是,所有的Unicode编码都可以转换为GB18030,而且GB18030除了兼容GBK以及Unicode的BMP部分外,其余的Unicode扩展平面和它的4字节扩展平面都是简单直接的映射
                ·其具体映射关系的计算参见《GB18030编码研究以及GBK、GB18030与Unicode的映射》:[http://blog.csdn.net/fmddlmyy/archive/2008/04/13/2288312.aspx]
    ·GB2312、GBK的编码范围如下:
-----------------------------
名称        第一字节            第二字节   
GB2312    0xA1-0xF7(161-247)    0xA1-0xFE(161-254)   
GBK        0x81-0xFE(129-254)    0x40-0xFE(64-254)
-----------------------------
    ·GB18030编码范围如下:
-----------------------------
字节数        码位空间
单字节         0x00~0x7F (0-127)
双字节         第一字节在0x81~0xFE (129-254)
        第二字节在0x40~0x7E,0×80至0×FE(64-126),(128-254)
四字节        第一字节在0x81~0xFE之间 (129-254)
        第二字节在0x30~0x39之间 (48-57)
        第三字节在0x81~0xFE之间 (129-254)
        第四字节在0x30~0x39之间 (48-57)
-----------------------------

·Unicode
            ·Unicode 字符集收录了这世界上所有的文字符号和特殊符号。对于每一个符号都定义了一个值,称为代码点(code point)。代码点可以用2个字节表示(UCS-2),也可以用4个字节(UCS-4编码)。

·UTF系列

    ·为什么出现UTF编码:
                ·UCS编码虽然定义了每个代码点的编码方式,但是没规定如何传输和存储。比如,在UCS-2码中,英文符号是在ACSII码的前面加上一个0 byte,像"A"的ASCII码 0x41,在UCS码中就是0x0041,这样,对于英文系统来讲会出现大量的0 byte,造成不必要的浪费。而且容易存在对现在ASCII码不兼容的问题。所以这个重担就落在了UTF编码身上,全称是Unicode Transformation Format。
    ·什么是Endian:
                ·我们知道"中"字的UFT-16编码是0x4E,0x2D,但是传输存储的过程中,字节的顺序有可能是(0x4E,0x2D),也可能是 (0x2D,0x4E),这就是涉及一个字节序的问题。对于前一种,我们称为Big Endian(大尾,也就是高位在前),而后一总称为Little Endian(小尾,低位在前)。
            ·那我们如何知道在不清楚哪一"尾"的情况下进行解析?
        ·先人已有解决的办法,就是在最前面加多2个字节,OxFEFF表示BE,而0xFFFE表示LE。(注:OxFEFF是实际上不存在的字符,所以正常情况下是不会使用到的,所以,不用担心出现与正常的字符数据冲突的问题),这就是所谓的BOM(Bill Of Material)。
            ·UTF系列都存在LE,BE,BOM,无BOM几种版本。
               · 比如"中国"的各个版本UTF-16字符编码如下:
------------------------------------------
编码            字节序列
UTF-16BE        4E,2D,56,FD
UTF-16LE        2D,4E,fD,56
UTF-16(BOM,BE)    FE,FF,4E,2D,56,FD
UTF-16(BOM,LE)    FF,FE,2D,4E,fD,56
------------------------------------------
    ·UTF-8
        ·UTF-8采用的是变长码的方式,其编码规则如下:
---------------------------------------------------------------------
代码点值的范围(16进制)    第1字节             第2字节             第3字节
0000 0000-0000 007F     0xxxxxxx0-127)            
0000 0080-0000 07FF     110xxxxx (192-223)    10xxxxxx (128-191)    
0000 0800-0000 FFFF     1110xxxx (224-239)    10xxxxxx (128-191)    10xxxxxx (128-191)   
---------------------------------------------------------------------
        ·注:x的内容是将左边代码点的二进制值依次注入。
               ·理论上UTF-8可以达到6个字节编码(上表省略后3位字节以上的编码方式),但实际上,我们一般只采用0x0000 0000 到0x0000 0000FFFF的范围内的字符,也就说UTF-8实际上只采用了3个字节编码。
               · UTF-8除了省空间和兼容ASCII的优点后,其编码方式(类似于哈夫曼编码,很容易判断出1个字节及其后面的字节数)决定了它以下两个优点:
                    ·1、与字节顺序无关, 可以在不同平台之间交流。
                    ·2、容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码)
    ·UTF-16和UTF-32
                ·UTF-16是变长码,大致上相当于UCS-2码的直接实现,但是也有一部分UCS-4的字符。所以可以猜到,它大部分是采用2个字节编码,而有部分特殊符号采用3字节编码,所以大致相当于20位编码, 值在0到0x10FFFF之间。
                ·UTF-32用四个字节表示代码点,这样就可以完全表示UCS-4的所有代码点。

热点排行