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)
zhidao.baidu.com/question/5246 ...
[
Last edited by firstsail on 2009-2-4 at 11:34 ]