最近做字體的時候遇到了很多問題。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;
}