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

故有代码:

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