• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

ocos2d-x中文乱码问题的几种办法

原创内容,转载请注明原文网址: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