程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 字體問題-如何判斷GB2312

字體問題-如何判斷GB2312

編輯:C++入門知識

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

}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved