原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0905/627.html
昨天游戏开发运营改写cocos2d-x的例程,想在其底子上加上一个计分体系。没有分数着实让人没有玩下去的动力!
我在主场景上加上了一个CCLabelTTF,用于表现分数。
但是意外的发现,当内容含有中文时,CCLabelTTF的表现内容为乱码。
无奈只好Google百度追求答案,清晰了这个问题的启事。
由于cocos2d-x里面因此utf8处分文本的,而VS干脆输入时文本编码为GBK,要是增加L标记,则为Unicode编码。
办理这个问题有三种办法:
将源代码文件留存为utf8编码,但是由于编译器的问题,这种方式会导致许多无法预测的问题
将字符串用utf8编码密集存到一文件中,而后用代码读取这些字符串来应用,这种办法还能很好的支撑多说话版本
应用字符串时,先将其转换为utf8编码
我终极应用了第三种方式,第一种撇开不说,第二种实现起来对照繁难,第三种则要利便许多。
普通在windows上,我们应用API MultiByteToWideChar来举行种种编码转换。
但是这东西只能在Windows上用,在cocos2d-x上用就有点分歧时宜的感受,真相安卓上可没这个API。
还好cocos2d-x思量很殷勤,它自带了一个iconv库
只需求在名目附加依赖项里进入libiconv.lib,并且包括头文件iconv/iconv.h即可应用。
我常州手游开发通过这个库封装了几个编码转换的函数,代码以下
复制代码
#include "Tool.h"
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 buff[1024];
sprintf_s(buff, 1024, "得分:%d", _Score);
_pLabelScore->setString(a2u(buff).c_str());
至此,我们可以在cocos2d-x中平常表现中文了!
上篇:上一篇:Unity5 新AssetBundle打包Build
下篇:下一篇:Cocos2Dx 少许残存的API