字体问题-如何判断GB2312

2014-11-24 00:40:32 · 作者: · 浏览: 4

最近做字体的时候遇到了很多问题。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]
// 判断字符串中有否 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;

}

// 判断字符串中有否 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;

}