本文由 @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; }参考博客