VC 多語言 字元編碼
阿新 • • 發佈:2019-01-24
VC編譯有兩種環境,ANSI(MBCS:multi-byte charset)和UNICODE
自Windows NT起,Windows的所有版本均完全由Unicode來構建。也就是說所有的 核心函式全部是Unicode的引數。因此,對外的類似FunctionA的ansi函式,其內部都是先轉換為FunctionW的Unicode函式形式,然後呼叫FunctionW。所以,一開始就用unicode開發要好得多。在開發dll的時,建議同時提供兩套介面。FunctionA內部呼叫FunctionW實現。
在程式開發有多語言要求時,UNICODE有更大的優勢。繁體字在UNICODE環境下是可以直接定義的。例如 CString str = _T("編碼"); 在ANSI環境下,如果使用繁體,不能直接如此定義,因為ANSI下的漢字編碼預設是GB編碼,而作業系統使用的繁體字一般是Big5編碼。因此,如果是MBCS環境,需要設計一個函式GB2Big。
編碼頁936是簡體中文下最廣泛使用的編碼系統,對應的最廣泛使用的繁體編碼頁是950。0x0804應該是如下的Locale。
WORD wLanguageID = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);
LCID Locale = MAKELCID(wLanguageID, SORT_CHINESE_PRCP);
完整程式碼:
參考部落格CString Gb2Big(char * sGb) { CString szOutput; char* pszGbt=NULL; //Gb編碼的繁體字元 char* pszGbs=NULL; //Gb編碼的簡體字元 wchar_t* wszUnicode=NULL; //Unicode編碼的字元 char* pszBig5=NULL; //Big5編碼的字元 char * sBig5=NULL; //返回的字串 int iLen=0; //需要轉換的字元數 pszGbs=sGb; //讀入需要轉換的字元引數 SORT_CHINESE_PRC MAKELCID //計算轉換的字元數 iLen=MultiByteToWideChar (936, 0, pszGbs, -1, NULL,0) ; //給pszGbt分配記憶體 pszGbt=new char[iLen*2+1]; if (NULL == pszGbt) { goto END; } //轉換Gb碼簡體到Gb碼繁體,使用API函式LCMapString LCMapStringA(0x0804,LCMAP_TRADITIONAL_CHINESE, pszGbs, -1, pszGbt, iLen*2); //給wszUnicode分配記憶體 wszUnicode=new wchar_t[iLen+1]; if (NULL == wszUnicode) { goto END; } //轉換Gb碼到Unicode碼,使用了API函式MultiByteToWideChar MultiByteToWideChar (936, 0, pszGbt, -1, wszUnicode,iLen); //CP_MACCP LCMAP_SORTKEY //計算轉換的字元數 iLen=WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ; //給pszBig5分配記憶體 pszBig5=new char[iLen+1]; if (NULL == pszBig5) { goto END; } memset(pszBig5,0,iLen+1); //轉換Unicode碼到Big5碼,使用API函式WideCharToMultiByte WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, pszBig5,iLen, NULL, NULL) ; //返回Big5碼字元 szOutput=pszBig5; //拷貝到原始資料中 // memcpy(sGb, sBig5, iLen); END: if (wszUnicode) { delete [] wszUnicode; } if (pszGbt) { delete [] pszGbt; } if (pszBig5) { delete [] pszBig5; } return szOutput; }