在cocos2d-x中直接显示中文的时候会出现乱码,虽然在实际开发中把字符串直接写在代码里也不是好的做法,但是有时候也是为了更方便了。 目前有两种方案来解决这个问题: 1. 使用iconv,引擎也提供了这个库,不过只是win32平台,移植到android上还得自己去下载iconv库编译。 2. 把字符串写到xml文件中,然后解析xml文件,格式按照android中的strings.xml 本文采用第一种方式解决。 下面来看具体的实现:
1、在工程中添加下述代码:
#ifdef WIN32
#define UTEXT(str) GBKToUTF8(str)
#else
#define UTEXT(str) str
#endif
#ifdef WIN32
#include "icon/include/iconv.h"
static char g_GBKConvUTF8Buf[5000] = {0};
const char* GBKToUTF8(const char *strChar)
{
iconv_t iconvH;
iconvH = iconv_open("utf-8","gb2312");
if (iconvH == 0)
{
return NULL;
}
size_t strLength = strlen(strChar);
size_t outLength = strLength<<2;
size_t copyLength = outLength;
memset(g_GBKConvUTF8Buf, 0, 5000);
char* outbuf = (char*) malloc(outLength);
char* pBuff = outbuf;
memset( outbuf, 0, outLength);
if (-1 == iconv(iconvH, &strChar, &strLength, &outbuf, &outLength))
{
iconv_close(iconvH);
return NULL;
}
memcpy(g_GBKConvUTF8Buf,pBuff,copyLength);
free(pBuff);
iconv_close(iconvH);
return g_GBKConvUTF8Buf;
}
#endif
2、进行中文显示:
CCMenuItemFont *itemFont1 = CCMenuItemFont::create(UTEXT("独立开发者er"));
CCMenuItemFont *itemFont2 = CCMenuItemFont::create("独立开发者er");
CCMenu *menuTmp = CCMenu::create(itemFont1, itemFont2, NULL);
menuTmp->alignItemsVerticallyWithPadding(10);
menuTmp->setPosition(visibleSize.width/2+300, visibleSize.height/2+200);
addChild(menuTmp);
3、显示结果如下:
4、结果分析:经过UTEXT装换的可以正常显示,没有经过转换的出现乱码。
由于用到了icon同时根据上述头文件查找路径,我们需要在工程属性中添加下述路径:
参考博客: