各种字符集

来源:互联网 发布:澳洲华人灭门案 知乎 编辑:程序博客网 时间:2024/04/28 04:57

source:http://blog.163.com/xiliang_pan/blog/static/4530843320086243106485/

各种字符集

默认分类   2008-07-24 15:10   阅读24   评论1  
字号: 大  中  小

为进行信息交换,各汉字使用地区都制订了一系列汉字字符集标准。
  国标码GB2312:(“国标”是中华人民共和国国家标准的简称)在中国大陆使用。GB2312只收录了6763个汉字,有不少汉字,如部分在GB2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱镕基的“镕”字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内,因此又制订了GBK编码。
GBK:全名为汉字内码扩展规范,K 即是“扩展”所对应的汉语拼音(KuoZhan)中“扩”字的声母,收录20912个汉字。
GB18030:收录27533个汉字,中华人民共和国国家标准总局于2000年推出的汉字编码标准,以取代GBK。
  BIG5码。收录13053个汉字。在台湾和香港使用的一字节或两字节编码。
Unicode:该标准采用多(于一)个字节代表每一字符,实现了使用单个字符集代表世界上几乎所有书面语言。目前Unicode是采用16位编码体系,Unicode是完全双字节表示的多国文字编码体系,编码空间0x0000-0xFFFF,许使用65000个不同的字符。足以善盖世界所有语言的所有字母,外加数千种符号。使用UniCodes编码的软件,不会再有语言的编码冲突,在同屏下,可以显示任何语种的文字,大陆、台湾两岸文档可以直接交流,不用进行GB/BIG5转换,这就是Unicode的最大好处。使用Unicode编码的输入法,可以直接使用在简体中文、繁体中文、英文、日文等操作系统上。

Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。

big endian和littleendian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。

字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

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

GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。

GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。

在DBCS中,GB内码的存储格式始终是big endian,即高位在前。

GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。

ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,而GB码是BABA。

Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"UniversalMultiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode CharacterSet"的缩写。

UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。

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。

绝大多数字符集,仅有一种编码,比如:  ASCII字符集/ASCII编码,ISO-8859字符集/ISO-8859编码,
  GB2312字符集/GB2312编码,GBK字符集/GBK编码,GB18030字符集/GB18030编码
  但Unicode是一个字符集,但编码有UTF-8,UTF-16,UTF-32三种.

字符集         一个某种语言的字符对应一个整数,字符集可以理解为一个1维/2维/3维的表格.这种表格就是字符集。
字符集的编码   字符集中每个字符对应的整数是以什么样的形式存储到计算机中的。 因为在计算机中都是0和1组成的,

GB2312 (GB2312-1980) 的编码:

* 单字节:第一字节     0--0x7F (0-127)
* 双字节:第一字节  0xB0--0xF7 (176--247) ,第二字节  0xA1--0xFE(161--254)

GBK (GB13000/GB12345) 的编码:
* 单字节:第一字节     0--0x7F (0-127)
* 双字节:第一字节  0x81--0xFE (129--254) ,第二字节  0x40--0xFE(64--254)

GB18030 的编码:
* 单字节:第一字节     0--0x7F (0-127)
* 双字节:第一字节  0x81--0xFE (129--254) ,第二字节  0x40--0xFE(64--254)
* 四字节:第一字节  0x81--0xFE (129--254) ,第二字节  0x30--0x39(48--57) 
          第三字节  0x81--0xFE (129--254) ,第四字节  0x30--0x39(48--57)

 可以清晰的看出(估算,可能存在偏差):
GB2312 的字符数: 128 + ( 247 - 176 + 1) * ( 254 - 161 + 1 ) = 6,896
GBK    的字符数: 128 + ( 254 - 129 + 1) * ( 254 - 64 + 1) =  24,194
GB18030的字符数: 128 + ( 254 - 129 + 1) * ( 57 - 48 + 1) * ( 254 - 129 + 1 ) * ( 57 - 48 + 1 ) = 1,587,728

 GB2312 (GB2312-1980) 的编码:
    * 单字节,  ( 00000000,01111111 )
    * 双字节,  ( 10110000,11110111 ) , ( 10100001,11111110 )

GBK (GB13000/GB12345) 的编码:
    * 单字节,  ( 00000000,01111111 )
    * 双字节,  ( 10000001,11111110 ) , ( 01000000,11111110 )

GB18030 的编码:
    * 单字节,  ( 00000000,01111111 )
    * 双字节,  ( 10000001,11111110 ) , ( 01000000,11111110 )
    * 四字节,  ( 10000001,11111110 ) , ( 00110000,00111001 )( 10000001,11111110 ),( 00110000,00111001)


 这三者的关系是: GB18030 > GBK > GB2312 > ASCII,这种包含关系是完全向下兼容的.(目前为止是猜测,证明似乎比较麻烦!推理了半天,没证明出来,....但曾经看过一句话说:GB18030完全可以运行GB2312的程序,所以猜测这种完全包容的关系是正确的)

. 世界码的演化

UCS字符集      32bit
Unicode字符集  16bit

================================
3.1 UCS (ISO 10646)字符集
================================

国际标准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS).
UCS 是所有其他字符集标准的一个超集,32bit. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串
翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息包含了世界上所有的语言和符号(尚未加入的,目前正在研
究如何更好的在计算机中编码)

3.1.1 32位UCS的使用划分:

    1.ISO 10646-1 标准:
    第一次发表于1993年,分配了前 65534 (2^16)个码位 (0x0000 到 0xFFFD). 这个 UCS 的 16位子集称为 基本多语
    言面 (Basic Multilingual Plane, BMP).ISO 10646-1 标准定义了字符集与 BMP 中内容的架构.新的字符仍源源不
    断地加入到 BMP 中, 但已经存在的字符是稳定的且不会再改变了.

    2.ISO 10646-2 标准:
    正在准备中,定义 BMP 以外的字符编码的第二部分.作为被编码在16位BMP 以外的字符都属于非常特殊的字符(比如
    象形文字), 且只有专家在历史和科学领域里才会用到它们.将来也许再也不会有字符被分配到21位以外的编码空间
    中了(从 0x000000 到 0x10FFFF ,覆盖了超过 100 万个潜在的未来字符);

3.1.2 UCS字符的名字:
UCS 不仅给每个字符分配一个代码, 而且赋予了一个正式的名字. 表示一个 UCS 或 Unicode 值的十六进制数, 通常在
前面加上 "U+", 就象 U+0041 代表字符"拉丁大写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是一致
的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的. 从 U+E000 到 U+F8FF, 已经 BMP 以外的大范围的编码
是为私用保留的

3.1.3 UCS组合字符:
由一个基本字符和它后面的一个或多个指示标记组成的复合字符.(有些语言有加音标或重音的需要);
基本字符可以作为一个UCS字符单独存在,但作为指示标记的UCS字符不能单独存在;这种组合字符其实分别都有各自单一
的UCS字符,这种可以由组合字符组成的单一UCS字符叫做预作字符,其目的是保持向后兼容.

例子:比如, 德语中的元音变音字符 ("拉丁大写字母A 加上分音符"), 既可以表示为 UCS 码 U+00C4 的预作字符, 也可
以表示成一个普通 "拉丁大写字母A" 跟着一个"组合分音符":U+0041 U+0308 这样的组合. 当需要堆叠多个重音符, 或
在一个基本字符的上面和下面都要加上组合标记时, 可以使用多个组合字符. 比如在泰国文中, 一个基本字符最多可加
上两个组合字符.

3.1.4 UCS 的实现级别
依据组合字符这种先进机制的实现程度,分为:
  级别1 不支持组合字符和 Hangul Jamo 字符 (一种特别的, 更加复杂的韩国文的编码, 使用两个或三个子字符来编码
        一个韩文音节) 
  级别2 类似于级别1, 但在某些文字中, 允许一列固定的组合字符 ,因为如果没有这最起码的几个组合字符, UCS 就不
        能完整地表达这些语言.
  级别3 支持所有的 UCS 字符,

 

================================
3.2 Unicode 字符集
================================

Unicode与UCS是分别尝试世界通用单一字符集的两种项目.一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由
(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode项目. 1991年前后,这两者达成一致,认为世界不需
要两个不同的单一字符集.,二者工作成果合并,为创立一个单一字符集编码表协同工作.但二者仍旧同时存在着,并各自发
表着自己的标准.


Unicode 和 ISO 10646 的异同同:
a. 相同点: 在16位(2个字节)以内,二者完全相同
Unicode 标准严密地包含了 ISO 10646-1 实现级别3的基本多语言面. 在两个标准里所有的字符都在相同的位置并且有
相同的名字.
b. 不同点:
Unicode 相对普遍,而且额外定义了许多与字符有关的语义符号学, 一般而言是对于实现高质量印刷出版系统的更好参考.


Unicode字符集

存储长度: 双字节字符集
编码长度: 16bits
编码范围: 0000H – ffffH
应    用: 用于统一全球语言文字的编码 多个编码区域分别负责不同字符类型编码,对汉语简体字、繁体字、日语、
          韩语统一编码。起初,在Unicode4.0之前,Unicode只定义了6万多个字符,最新Unicode版本是5.0,共包含了9万
          多个字符,几乎包括了人类社会所有的字符.


================================
3.3 UCS 的编码:
================================

UCS字符集有两种编码形式: UCS-2(双字节) 和 UCS-4(单字节).UCS的两种编码是不能

3.3.1 UCS-2编码 :
1) 定      义:完全和UNICODE字符集一致的双字节编码 ,UCS-2有2^16=65536个码位
3) 支持的平台;Windows API   UNIX接口   ANSI标准接口   自己开发


3.3.2 UCS-4编码 :
1) 定义:   完全支持ISO-10646规范字符数,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码,UCS-4
            有2^31=2147483648个码位。
2) 说明:   a.根据最高位为0的最高字节分成2^7=128个group;
            b.每个group根据 次高字节 分为256个面   plane;
            c.每个plane根据第3个字节 分为256个行  (rows);
            d.每个 row 根据第4个字节 分为256个单元(cells);
3) 支持的平台:目前还没有支持的操作系统 第三方软件产品接口 自己开发
4) 与BMP的关系  :group 0同时plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP
5) 和UCS-2的关系:将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。
6) 注意: 目前的UCS-4规范中还没有任何字符被分配在BMP之外

 

================================
3.4 Unicode 的编码:
================================
Unicode是一个字符集,但编码有UTF-8,UTF-16,UTF-32三种.

3.4.1  UTF-32编码 :
     
    每个字符(codepoint)用32个bit来编码.
    比如'a'的Unicode's codepoint是61,因此编码成000000000000000000111101,
    可见,它和ASCII编码并不兼容.因为它用了四个字节.


3.4.2  UTF-16编码 :
    Unicode's codepoint 的范围: [U+0000,U+D7FF],[U+E000,U+FFFF],用16个bits来编码 .兼容UCS-2
    Unicode's codepoint 在范围: [U+10000,U+10FFFF],用32个bits来编码(利用代理对)  .表示UCS-4中的一部分代码
    UTF-16也是和ASCII编码不兼容的.
    支持的平台: 特定软件平台 HTML XML 第三方软件接口 …

3.4.1 UTF-8 编码:

    这是一种变长编码:
     1)  单字节:ASCII
     2)  2字节-六字节:对应UCS-4编码
    utf8是我们常用的编码方式,在web开发中使用utf8编码能完全解决字符集问题。其实utf8是unicode字符集的一种
    物理实现,它描述了如何高效的存储unicode的内码(就是上面说的字符在字符集的顺序码)

    UTF-8 有以下特性:
    a. UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位
       ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的.
    b. 所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节
       0x00-0x7F) 不可能作为任何其他字符的一部分.
    c. 表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节.
       多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字
       节的影响. 可以编入所有可能的 231个 UCS 代码

    注意:关于b.和c.的理解: UTF-8中多种不定长(变长)字符可共存的根本原因是:
      单字节的ACII码 :被编码为----- 0x00 到 0x7F
      多字节UTF-8字符:非第一个字节--- 0x80 到 0xBF
                           第一个字节--- 0xC0 到 0xFD
      所以最终剩余两个字符: 0xFE,0xFF总是没有被UTF-8用到.

    UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长.
    Bigendian UCS-4 字节串的排列顺序是预定的.
   
    Unicode字符编码为UTF-8的转换机制:
   
    1) 转化表:
    UCS-4 range (hex.)        UTF-8 octet sequence (binary)
    U-00000000 - U-0000007F:  0xxxxxxx                                      1byte      :ASCII
    U-00000080 - U-000007FF:  110xxxxx 10xxxxxx                             2byte-6byte:对应UCS-4编码
    U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx 
    U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
    U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
   
    注意:这里得到的UTF-8编码从1byte到6byte,不是定长!
   
    2) 表的使用方法:
    xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的
   
    3) 下面是一个例子:
   
    字符"汉"的UTF-8编码
    1."汉"的unicode是6C49,确定该字符Unicode的二进制为(110110001001001)
    2.查找转化表,确定在这个字符所属区间是:(U-00000800 - U-0000FFFF),1110xxxx 10xxxxxx 10xxxxxx
    3.从低位起将0/1分别顺序填入x位置:
    U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx 
    Unicode6C49的二进制:          110   110001  001001
    于是得到了"汉"的UTF-8为: 11100110 10110001 10001001
    结论:十六进制形式为:E6B189

 

 

============================================  概念篇 ====================================================

 

=================================================================
1. big endian和little endian
=================================================================
  big endian和little endian是CPU处理多字节数的不同方式:
    big endian   : 编码的高字节在前
    little endian: 编码的低字节在前
    例如“汉”字的Unicode编码是6C49。那么写到文件里时,如果将6C写在前面,就是big endian。还是将49写在前面
    ,就是little endian。
    我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
=================================================================
2. 乱码的由来
=================================================================
 为什么会产生"乱码",可以通过举例来说明。比如一个文章作者写了“汉字”两个字符后,以GBK形式保存在计算机
 的存储设备中(这种存储方式一定是以二进制字节流形式,本例中“汉字”的GBK编码是BA、BA、D7、D6); 然后在读
 取时,计算机中的二进制码“BA、BA、D7、D6”(原作者本意是“汉字”)却不是以同样的GBK形式被解释成"汉字"
 这两个字符,而是(比如说)以ISO-88591形式被读取,那么"BA、BA、D7、D6"肯定会被解释成四个西欧文字了!更恐
 怖的是,如果以ASCII解释"BA、BA、D7、D6",即使能成功对应上ASCII字符集,也会解释出4个字符出来,但
 "BA、BA、D7、D6"这四个字节都超出了"00H - 7FH"的范畴,天知道会得到一个什么样的结果!(应该以其补码来解
 释吗?不知道,暂时也懒得花时间管).

=================================================================
3. 区位码、国标码、GB2312、内码和代码页
=================================================================

   首先回忆GB2312作为单、双字节变长码的编码规则:
   * 单字节:第一字节     0--0x7F (0-127)
   * 双字节:第一字节  0xB0--0xF7 (176--247) ,第二字节  0xA1--0xFE(161--254)

   1. 定义:

  “GB2312的原文”是指国家1980年的《GB 2312-80》标准。

   ***国标码:指的就是GB2312-80,每个中文字符用一个四位十六进制数表示。
  ***区位码:是一个四位的十进制数,是1个( GB2312字符 - 'A0') 的十进制表示。

  注意:之所以绕个圈子,将GB2312用上面的简单规则转为10进制的区位码,是因为区位码表示出来的意义容易接受.

   2. 区位码的意义:

   这个标准用两个数来编码汉字和中文符号。第一个数称为“区”,第二个数称为“位”。所以也称为区位码。

   区的编码从 1开始到94:

    01-08区 是符号区,全角英文字母,希腊、日文、俄文等等,
       09区 是造表符号
    10-15区 是空,未定义,
    16-55区 是一级汉字:一级汉字(3755个最常用的汉字,按拼音字母的次序排列)
    56-87区 是二级汉字:二级汉字(3008个汉字,按部首次序排列)

   3. Windows区位输入法

      这个区位输入法可以自动识别16进制和10进制的区位码,得到相同的转换结果,例如:
  
      输入1601得到“啊”。
      输入B0A1得到“啊”。

      说明: 常使用于录入特殊符号,如制表符、希腊字母等。

   4. 一个区位码转化为GB2312的例子:
      1) "啊"的区位码是1601,写成16进制是0x10,0x01。这和计算机广泛使用的ASCII编码冲突。
      2) 在区位码的高、低字节上分别加上A0, “啊”的编码就成为B0A1
      3) B0A1就是GB2312

=================================================================
4.  内码  代码页  操作系统默认使用的编码
=================================================================

   1. 内码       是指操作系统内部的字符编码。
  
  
   2. 代码页     Windows的内码是Unicode, 但可以根据用户指定的locale,,操作系统默认采用与该locale相对应的编
            码来解释它遇见的byte流, 代码页中存放的自然就是相应的编转码方案了.windows就是用代码页适应
           各种语言的.
                 
                  代码页是可以指定的: 例如GBK的code page是CP936,GB2312的code page是CP20936.
  
                  指定了哪种代码页,系统/软件就用哪种编码来解释遇见的byte流.

   3. 缺省代码页  指操作系统根据locale默认使用的代码页.
  
                  注意:微软一般将缺省代码页指定的编码说成是"内码"。所以如今“内码”的概念就比较模糊了。
  
                  记事本的另存为中有一项ANSI,其实就是按照缺省代码页的编码方法保存。


   4. 文件指定字符集

                   只要文件能说明自己使用什么编码,用户又安装了对应的代码页,Windows就能正确显示。

       考虑下面一种情况:

         有一个HTML英文作者,认为世界上所有人都使用英文,在文件中不指定charset。如果他使用了
         0x80-0xff之间的字符,中文Windows又按照缺省的GBK去解释,就会出现乱码。

      解决方法:在这个html文件中加上指定charset的语句就可以了:
      <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">

   注意:代码页仅是是微软公司的叫法。作为程序员,我们只要知道它们是什么东西,没有必要过多地考证这些名词。

 


  
=================================================================
  5. ANSI编码
=================================================================


以下从更广义的范畴讲述编码进化的由来,之前提起的汉字的编码的演化,不过是ansi的一种罢了

计算机对多国语言的支持角度看,大致可以分为三个阶段:

阶段一
系统内码:ASCII
说明    :计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。
系统    :英文 DOS

阶段二
系统内码:ANSI编码 (本地化)
说明    :不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个
          字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码:
    1) 在简体中文系统下,ANSI 编码代表 GB2312 编码;
    2) 在日文操作系统下,ANSI 编码代表 JIS 编码。
系统    :中文 DOS,中文 Windows 95/98,日文 Windows 95/98

阶段三
系统内码:UNICODE (国际化)
说明    :为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一
          并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求.
系统    :Windows NT/2000/XP,Linux,Java


关于阶段二(“本地化”阶段)的具体解释:

  在使用 ANSI 编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示(MBCS),因此,这种方式存放的字符
  也被称作多字节字符。比如,"中文123" 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字
  字符占1个字节:
D6 D0 CE C4 31 32 33 00
----- ----- -- -- -- --  
  中    文   1  2  3 /0

</pre>

原创粉丝点击