VC 多语言 字符编码

本文由 @lonelyrains 出品,转载请注明出处。 
文章链接: http://blog.csdn.net/lonelyrains/article/details/11093691


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;
}
参考博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值