字体问题-如何判断GB2312

最近做字体的时候遇到了很多问题。C++中如何通过一串字符,判断是否有GB2312。让我们先来了解一下GB2312基本知识

:GB 2312-1980

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

GB2312 码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。

GB2312 收录简化汉字及符号、字母、日文假名等共 7445 个图形字符,其中汉字占 6763 个。GB2312 规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。

GB2312 将代码表分为 94 个区,对应第一字节;每个区 94 个位,对应第二字节,两个字节的值分别为区号值和位号值加 32(2OH),因此也称为区位码。01-09 区为符号、数字区,16-87 区为汉字区,10-15 区、88-94 区是有待进一步标准化的空白区。GB2312 将收录的汉字分成两级:第一级是常用汉字计 3755 个,置于 16-55 区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区,按部首/笔画顺序排列。故而GB2312最多能表示 6763 个汉字。

GB2312 的编码范围为 2121H-777EH,与 ASCII 有重叠,通行方法是将 GB 码两个字节的最高位置 1 以示区别。

 

 

通过以上知识,我们知道了,只要判断低字节是否在 A1-FE之间即可。

故有代码:

 

  1. <span style=”font-size:18px;”>// 判断字符串中有否 GB2312 字符
  2. static bool hasGB2312Char(const char* pchText)
  3. {
  4.     uint uLen;
  5.     if (1 >= (uLen = strlen(pchText)))
  6.         return false;   // 单个字符
  7.     const uchar* pText = (const uchar*)pchText;
  8.     uchar u1, u2;
  9.     bool bEC = false;
  10.     while (0 != (u1 = *pText++))
  11.     {
  12.         if (u1 < 0xA1 || u1 > 0xFE)
  13.             continue;
  14.         u2 = *pText++;
  15.         if (!u2)
  16.             break;
  17.         if (u2 >= 0xA1 && u2 <= 0xFE)
  18.         {
  19.             bEC = true;
  20.             break;
  21.         }
  22.     }
  23.     return bEC;
  24. }</span>

标签