cocos2d-x解决中文乱码问题的几种办法
2014-03-17 20:57
411 查看
昨天改写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即可使用。
我通过这个库封装了几个编码转换的函数,代码如下
然后在每次要使用中文前,用a2u函数将文本转换为utf-8编码,使用例程如下:
至此,我们可以在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中正常显示中文了!
相关文章推荐
- cocos2d-x解决中文乱码问题的几种办法
- cocos2d-x解决中文乱码问题的几种办法
- Cocos2d-x 3.1.1 学习日志4--cocos2d-x解决中文乱码问题的几种办法
- Cocos2d-x 3.1.1 学习日志4--cocos2d-x解决中文乱码问题的几种办法
- cocos2d-x解决中文乱码问题的几种办法
- get/post时中文乱码问题的解决办法
- request.getParameter中文乱码问题解决办法
- IntelliJ IDEA 中文乱码问题解决办法
- JS中页面与页面之间超链接跳转中文乱码问题的解决办法
- PLSQL中文乱码问题解决办法
- cocos2d-x中文乱码问题解决
- osql执行SQL脚本内容包含中文时出现乱码问题的解决办法
- IntelliJ IDEA 中文乱码问题解决办法(转)
- 运行Jmeter时,响应数据中文乱码问题解决办法
- struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
- sourceinsight中文显示乱码问题彻底解决办法
- get/post时中文乱码问题的解决办法(转载)
- Qt下中文乱码问题的解决办法
- Javamail中的常见中文乱码问题与解决办法(综合)
- 解决cocos2d-x 中文乱码的问题