文章来源:松牛收集整理    作者:sj
发布时间:2007-05-30 08:57:00    阅读次数:1262 次

本文标签(Tag)

汉字编码 区位码 算法

    为了使每一个汉字有一个全国统一的代码,1980年,我国颁布了第一个汉字编码的国家标准:GB2312-80《信息交换用汉字编码字符集》基本集,这个字符集是我国中文信息处理技术的发展基础,也是目前国内所有汉字系统的统一标准。到了后来又公布了国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,简称GB18030。由于国标码是四位十六进制,为了便于交流,大家常用的是四位十进制的区位码。所有的国标汉字与符号组成一个94×94的矩阵。在此方阵中,每一行称为一个"区",每一列称为一个"位",因此,这个方阵实际上组成了一个有94个区(区号分别为0 1到94)、每个区内有94个位(位号分别为01到94)的汉字字符集。一个汉字所在的区号和位号简单地组合在一起就构成了该汉字的"区位码"。在汉字的区位码中,高两位为区号,低两位为位号。在区位码中,01-09区为682个特殊字符,16-87区为汉字区,包含6763个汉字 。其中16-55区为一级汉字(3755个最常用的汉字,按拼音字母的次序排列),56-87区为二级汉字(3008个汉字,按部首次序排列)。
    从汉字到区位码的转换。区位码是与汉字一一对应的编码,用四位数字表示, 前两位从01 到94称区码,后两位从01到94称位码。 一个汉字的前一半为“160+区码”的字符,后一半为“160+ 位码”的字符。例如:“刘”的区位码是 3385,其意为区码33位码85,它是由160+33=193和160+85=245的两个字节组成。即 0xC1F5,它就是汉字的 gb2312 编码。
下面程序将汉字 gb2312 转为相应的区位码:

#include
#include
using namespace std;
int main()
{
   // temp[0] 为高字节,temp[1] 为低字节
   // 当输入单个 ascii 字符时,只存进 temp[0]
   // 当输入的不是中文或单个 ascii 字符时,程序退出
   unsigned char temp[2];
   cin >> temp;
   while(temp[1])
   {
      cout
      // 输入下一个字符前,先将 temp[1] 清零
      temp[1] = 0;
      cin >> temp;
   }
   return 0;
}