当前位置:编程学习 > C/C++ >>

字体问题-如何判断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之间即可。

故有代码:


[cpp]
<SPAN style="FONT-SIZE: 18px">// 判断字符串中有否 GB2312 字符  
 
static bool hasGB2312Char(const char* pchText) 
 

 
    uint uLen; 
 
    if (1 >= (uLen = strlen(pchText))) 
 
        return false;   // 单个字符  
 
    const uchar* pText = (const uchar*)pchText; 
 
    uchar u1, u2; 
 
    bool bEC = false; 
 
    while (0 != (u1 = *pText++)) 
 
    { 
 
        if (u1 < 0xA1 || u1 > 0xFE) 
 
            continue; 
 
         
 
        u2 = *pText++; 
 
        if (!u2) 
 
            break; 
 
        if (u2 >= 0xA1 && u2 <= 0xFE) 
 
        { 
 
            bEC = true; 
 
            break; 
 
        } 
 
    } 
 
    return bEC; 
 
}</SPAN> 

// 判断字符串中有否 GB2312 字符

static bool hasGB2312Char(const char* pchText)

{

 uint uLen;

 if (1 >= (uLen = strlen(pchText)))

  return false; // 单个字符

 const uchar* pText = (const uchar*)pchText;

 uchar u1, u2;

 bool bEC = false;

 while (0 != (u1 = *pText++))

 {

  if (u1 < 0xA1 || u1 > 0xFE)

   continue;

       

  u2 = *pText++;

  if (!u2)

   break;

  if (u2 >= 0xA1 && u2 <= 0xFE)

  {

   bEC = true;

   break;

  }

 }

 return bEC;

}

 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,