前言
由于cocos2d-x内部是以utf8处理文本的,而VS直接输入时文本编码为GBK,所以在类似在CCLabelTTF等上显示中文时会出现乱码。
以下是解决该问题,较便捷的方法之一。
1. 在VS中给项目附加依赖项里加入libiconv.lib
在VS“解决方案资源管理器”视图中——项目->属性->配置属性->连接器->输入->附加依赖项里填写“libiconv.lib”,多个lib以空格隔开(等同于“#pragma comment(lib, "libicon.lib")”语句)。
2.包含头文件iconv/iconv.h.,并通过这个库封装几个编码转换函数
代码如下:
#include "iconv\iconv.h"
#include <iostream>
#include <cstring>
int code_convert(const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
iconv_t cd;
const char *temp = inbuf;
const char **pin = &temp;
char **pout = &outbuf;
memset(outbuf,0,outlen);
cd = iconv_open(to_charset,from_charset);
if(cd==0) return -1;
if(iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
/*UTF8תΪGB2312*/
std::string u2a(const char *inbuf)
{
size_t inlen = strlen(inbuf);
char * outbuf = new char[inlen * 2 + 2];
std::string strRet;
if(code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
{
strRet = outbuf;
}
delete [] outbuf;
return strRet;
}
/*GB2312תΪUTF8*/
std::string a2u(const char *inbuf)
{
size_t inlen = strlen(inbuf);
char * outbuf = new char[inlen * 2 + 2];
std::string strRet;
if(code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
{
strRet = outbuf;
}
delete [] outbuf;
return strRet;
}
然后在每次要使用中文前,用a2u函数将文本转换为utf-8编码,使用例程如下:
char lifebuff[1024];
sprintf(lifebuff, "生命值:");
lifeIndicator->setString(a2u(lifebuff).c_str());