中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 关于GBK的一些总结 上一主题 | 下一主题
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『楼 主』:  关于GBK的一些总结

GBK简介

    GBK 是一个汉字编码标准,全称《汉字内码扩展规范》(GBK),英文名称 Chinese Internal Code Specification ,中华人民共和国全国信息技术标准化技术委员会 1995 年 12 月 1 日制订,国家技术监督局标准化司、电子工业部科技与质量监督司 1995 年 12 月 15 日联合以技监标函 [1995] 229 号文件的形式,将它确定为技术规范指导性文件,发布和实施。这一版的 GBK 规范为 1.0 版。GB 即“国标”,K 是“扩展”的汉语拼音第一个字母。

    GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1 国际标准,是前者向后者过渡过程中的一个承上启下的标准。

    ISO 10646 是国际标准化组织 ISO 公布的一个编码标准,即 Universal Multilpe-Octet Coded Character Set(简称 UCS),大陆译为《通用多八位编码字符集》,台湾译为《广用多八位元编码字元集》,它与 Unicode 组织的 Unicode 编码完全兼容。ISO 10646.1 是该标准的第一部分《体系结构与基本多文种平面》。我国 1993 年以 GB 13000.1 国家标准的形式予以认可(即 GB 13000.1 等同于 ISO 10646.1)。

    ISO 10646 是一个包括世界上各种语言的书面形式以及附加符号的编码体系。其中的汉字部分称为“CJK 统一汉字”(C 指中国,J 指日本,K 指朝鲜)。而其中的中国部分,包括了源自中国大陆的 GB 2312、GB 12345、《现代汉语通用字表》等法定标准的汉字和符号,以及源自台湾的 CNS 11643 标准中第 1、2 字面(基本等同于 BIG-5 编码)、第 14 字面的汉字和符号。

一、字汇
    GBK 规范收录了 ISO 10646.1 中的全部 CJK 汉字和符号,并有所补充。具体包括:
    1. GB 2312 中的全部汉字、非汉字符号。
    2. GB 13000.1 中的其他 CJK 汉字。以上合计 20902 个 GB 化汉字。
    3. 《简化字总表》中未收入 GB 13000.1 的 52 个汉字。
    4. 《康熙字典》及《辞海》中未收入 GB 13000.1 的 28 个部首及重要构件。
    5. 13 个汉字结构符。
    6. BIG-5 中未被 GB 2312 收入、但存在于 GB 13000.1 中的 139 个图形符号。
    7. GB 12345 增补的 6 个拼音符号。
    8. 汉字“○”。
    9. GB 12345 增补的 19 个竖排标点符号(GB 12345 较 GB 2312 增补竖排标点符号 29 个,其中 10 个未被 GB 13000.1 收入,故 GBK 亦不收)。
    10. 从 GB 13000.1 的 CJK 兼容区挑选出的 21 个汉字。
    11. GB 13000.1 收入的 31 个 IBM OS/2 专用符号。

二、码位分配及顺序
    GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。
    全部编码分为三大部分:

    1. 汉字区。包括:
        a. GB 2312 汉字区。即 GBK/2: B0A1-F7FE。收录 GB 2312 汉字 6763 个,按原顺序排列。
        b. GB 13000.1 扩充汉字区。包括:
            (1) GBK/3: 8140-A0FE。收录 GB 13000.1 中的 CJK 汉字 6080 个。
            (2) GBK/4: AA40-FEA0。收录 CJK 汉字和增补的汉字 8160 个。CJK 汉字在前,按 UCS 代码大小排列;增补的汉字(包括部首和构件)在后,按《康熙字典》的页码/字位排列。

    2. 图形符号区。包括:
        a. GB 2312 非汉字符号区。即 GBK/1: A1A1-A9FE。其中除 GB 2312 的符号外,还有 10 个小写罗马数字和 GB 12345 增补的符号。计符号 717 个。
        b. GB 13000.1 扩充非汉字区。即 GBK/5: A840-A9A0。BIG-5 非汉字符号、结构符和“○”排列在此区。计符号 166 个。

    3. 用户自定义区:分为(1)(2)(3)三个小区。
        (1) AAA1-AFFE,码位 564 个。
        (2) F8A1-FEFE,码位 658 个。
        (3) A140-A7A0,码位 672 个。
        第(3)区尽管对用户开放,但限制使用,因为不排除未来在此区域增补新字符的可能性。

四、字库结构
    根据上面所述可知,字库结构如下




五、C语言程序取GBK字库纪录号如下:

//函数功能:获得GBK的汉字纪录号
//入口参数:WORD wCode--------GBK汉字/非汉字代码
//出口参数:无
//返 回 值:GBK的汉字纪录号(0,1,2,....,23939)

DWORD AfxGBK_GetRecord(WORD wCode)
{

        DWORD X, Y, Z, M;
        BYTE  byQu, byWei;

        byQu  = (wCode & 0xFFu); //低8位
        byWei = (wCode >> 8);//高8位
                               
        if (byWei >= 0xA1u)
        {               
                M = (DWORD)94u; //由0xA1 ~ 0xFE计算而来;
                Y = (DWORD)(byWei - 0xA1u);

                if (byQu >= 0xA1u ) //这是GBK/1、USER/1、GBK/2、USER/2部份
                {
                        X = (DWORD)(byQu - 0xA1u);
                        Z = 0u;
                }
                else //这是GBK/3高字节0xA1~0x7E部份
                {
                        X = (DWORD)(byQu - 0x81u);
                        Z = 0x2284Lu; //由94L * 94L计算而来
                }
        }
        else
        {
                M = (DWORD)96u; //由0x40~0xA0计算而来, 但不含0x7F;
                Y = (DWORD)(byWei - 0x40u);

                if (byWei > 0x7Fu)
                {
                        Y--; //不含0x7F
                }

                if (byQu < 0xA1u) //这是GBK/3高字节0x40~0xA0部份
                {
                        X = (DWORD)(byQu - 0x81u);
                        Z = 0x2E44Lu; //由94L * 94L + 32L * 94L计算而来
                }
                else //这是USER/3、GBK/5、GBK/4部份
                {
                        X = (DWORD)(byQu - 0xA1u);
                        Z = 0x3A44Lu; //由94L * 94L + 32L * 94L + 32L * 96L计算而来
                }
        }

        return (X * M + Y + Z);
}

[参考]
(1)http://zhidao.baidu.com/question/52465500.html

[ Last edited by firstsail on 2009-2-4 at 11:34 ]

2009-2-3 18:34
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
zyl910
中级用户





积分 282
发帖 126
注册 2006-5-17
状态 离线
『第 2 楼』:  

90年代初,GB开始与Unicode合作。
1993年推出GB13000.1-1993标准,即Unicode中的CJK基本集,共收录2.1万汉字。但当时只有unicode编码,无GB编码。
微软在开发中文Win95时觉得GB2312-1980只有6千字不够用,所以对GB2312-1980进行扩充,加入GB13000.1字集,形成所谓的GBK编码。GBK本来只是厂家私自编码,而不是国家/国际标准,但由于微软强势,业内逐渐认同了GBK。
后来微软又逐渐在GBK中增加(Unicode中的)CJK兼容集,使其收录2.7万汉字。但由于这些汉字很多加在用户自定义区,造成了编码混乱。
为了解决混乱状况,国家推出了GB18030-2000标准,承认GBK编码规则,并且提出4字节编码规则,使编码空间增加260万。全面收录(Unicode中的)CJK基本集、CJK扩充集A、CJK扩充集B、CJK兼容集、CJK兼容集扩充等,共收录7万汉字,并修正了GBK中的混乱编码。
2005年推出GB18030-2005标准,只是GB18030-2000一个小补丁,将Unicode空间的编码均映射到GB18030空间。注意不仅是汉字,其他语言字符也都映射,使得GB18030空间等同于Unicode空间。



人类存在的目的就是试图理解人类为何存在
2009-2-4 10:08
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 3 楼』:  

已更正贴子里面的“图片”和“函数”的错误!

2009-2-4 11:37
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
rzg1972
中级用户





积分 250
发帖 103
注册 2006-1-7
状态 离线
『第 4 楼』:  

受教!长知识了!谢谢!

2010-1-17 13:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: