昨天改写cocos2d-x的例程,想在其基础上加上一个计分系统。没有分数实在让人没有玩下去的动力!

我在主场景上加上了一个CCLabelTTF,用于显示分数。

但是意外的发现,当内容含有中文时,CCLabelTTF的显示内容为乱码。

无奈只好Google百度寻求答案,明白了这个问题的缘由。

因为cocos2d-x内部是以utf8处理文本的,而VS直接输入时文本编码为GBK,如果添加L标志,则为Unicode编码。

解决这个问题有三种办法:

  1. 将源代码文件保存为utf8编码,不过由于编译器的问题,这种方式会导致很多无法预测的问题

  2. 将字符串用utf8编码集中存到一文件中,然后用代码读取这些字符串来使用,这种办法还能很好的支持多语言版本

  3. 使用字符串时,先将其转换为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,,outlen);
cd = iconv_open(to_charset,from_charset);
if(cd==) return -;
if(iconv(cd,pin,&inlen,pout,&outlen)==-) return -;
iconv_close(cd);
return ;
} /*UTF8转为GB2312*/
std::string u2a(const char *inbuf)
{
size_t inlen = strlen(inbuf);
char * outbuf = new char[inlen * + ];
std::string strRet;
if(code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, inlen * + ) == )
{
strRet = outbuf;
}
delete [] outbuf;
return strRet;
} /*GB2312转为UTF8*/
std::string a2u(const char *inbuf)
{
size_t inlen = strlen(inbuf);
char * outbuf = new char[inlen * + ];
std::string strRet;
if(code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, inlen * + ) == )
{
strRet = outbuf;
}
delete [] outbuf;
return strRet;
}

然后在每次要使用中文前,用a2u函数将文本转换为utf-8编码,使用例程如下:

//刷新分数显示
char buff[];
sprintf_s(buff, , "得分:%d", _Score);
_pLabelScore->setString(a2u(buff).c_str());

至此,我们可以在cocos2d-x中正常显示中文了!

cocos2d-x解决中文乱码问题的几种办法的更多相关文章

  1. Cocos2d-x 3.1.1 学习日志4--cocos2d-x解决中文乱码问题的几种办法

    做个打飞机的游戏,由于版本号太新,网上基本没有教教程,我的版本号是cocos2d-x 3.1.1的.今天遇到cocos2dx中中文乱码的问题.无奈仅仅好Google百度寻求答案,明确了这个问题的缘由. ...

  2. Web---演示servlet技术(servlet生命周期),解决中文乱码问题

    本节讲解决中文乱码问题的4种方法. 还有更好的方法,也就是用过滤器,这里就不演示了,博主目前也不会~呼♪(^∇^*)~过段时间才会学. servlet生命周期演示: index.jsp: <%@ ...

  3. cocos2d-x:读取指定文件夹下的文件名称+解决中文乱码(win32下有效)

    援引:http://blog.csdn.net/zhanghefu/article/details/21284323 http://blog.csdn.net/cxf7394373/article/d ...

  4. 增加UBUNTU字符集 解决中文乱码问题

    对GBK,GB2312,GB18030字符集的支持是UBUNTU中文乱码的罪魁祸首,其实我们可以在保持UTF-8为默认编码的条件下添加对这几个编码的支持,以解决中文乱码问题. 我想这个问题肯定有其他人 ...

  5. Sublime Text 2—解决中文乱码

    Sublime Text 2是一个非常棒的代码及文本编辑器,绿色小巧.速度飞快,跨平台支持Win/Mac/Linux,支持32与64位,支持各种流行编程语言的语法高亮.代码补全等,有着许多其他编辑器没 ...

  6. zabbix解决中文乱码问题(没有测试成功)

    zabbix解决中文乱码问题 1.在windows系统中找一个自己喜欢的字体,这里我们用:msyh.ttf 2.将字体上传至/var/www/html/zabbix/fonts目录下 [root@za ...

  7. 【原创】通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...

    这篇blog重点在解决问题,如果你对字符编码并不是特别了解,建议先看看 < [原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 >. 当然,如果只是针对解决这个Mysql插入报错 ...

  8. Debian 6解决中文乱码

    DEBIAN下中文显示 一.首先检查LOCALE情况 说明:DEBIAN因为基于GNU所以,对不同地域进行了不同的包支持,以LOCALE形式存在. 1.挂载ISO文件包,前8个ISO包就可以(这里不在 ...

  9. 04_过滤器Filter_02_Filter解决中文乱码问题

    [过滤器解决中文乱码问题实例] [工程截图] [web.xml] <?xml version="1.0" encoding="UTF-8"?> &l ...

随机推荐

  1. HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)

    题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路:  设A = |(1, 1),(1, 0) ...

  2. acm2024

    /**  * C语言合法标识符  */ import java.util.*; public class acm2024 { public static void main(String[] args ...

  3. tomcat启用压缩的方式

    <Connector port="7070" protocol="HTTP/1.1"connectionTimeout="20000" ...

  4. Web文件管理、私有云存储管理工具 DzzOffice

    DzzOffice-大桌子办公系统本身是一款图形化,简单易用的网盘管理软件.可以实现将企业的局域网服务器.企业私有云存储.企业租用的公有云存储(如阿里云OSS).企业员工的私有云存储(如百度网盘.Dr ...

  5. Oracle执行SQL报错ORA-00922

    问题描述: 对Oracle数据库执行序列化脚本出错,ora-00922 missing or invalid option  #无效的选项 问题解决: 对于set define off --这个是sq ...

  6. 重要:VC DLL编程

    VC DLL编程 静态链接:每个应用程序使用函数库,必须拥有一份库的备份.多个应用程序运行时,内存中就有多份函数库代码的备份. 动态连接库:多个应用程序可以共享一份函数库的备份. DLL的调用方式:即 ...

  7. Persona——Web人物角色介绍

    一.什么是人物角色? 人物角色,即persona([pə:’səunə]),这里讨论的主要是web persona,是指针对网站目标群体真实特征的勾勒,是真实用户的综合原型.我们对产品使用者的目标.行 ...

  8. Warning: RPMDB altered outside of yum.的解决办法

    错误提示: Warning: RPMDB altered outside of yum 解决办法: 删除yum的历史记录rm -rf /var/lib/yum/history/*.sqlite 上面的 ...

  9. JFinal常见问题和知识点笔记

    1.当主键Id命名不是“id”时,应该显式地将自定义的id指出来 例如: Db.deleteById("post_user","user_id", 5); 2. ...

  10. 【jQuery】将form表单通过ajax实现无刷新提交

    //将form转换为AJAX提交 function ajaxSubmit(url,frm,fn){ var dataPara=getFormJson(frm); $.ajax({ url:url, t ...