1. 程式人生 > >VC 多語言 字元編碼

VC 多語言 字元編碼

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;
}
參考部落格