本文由 @lonelyrains 出品,转载请注明出处。
文章链接: http://blog.csdn.net/lonelyrains/article/details/11093691
自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;
}
参考博客