字体问题-如何判断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++ ,