前言:

将GBK编码的字符串转为UTF-8编码。(通俗点说就是解决中文乱码问题)

简要介绍:

在Win32平台下通过 log 输出中文字符时,会出现中文乱码问题。同样的代码在 ios 和 Android 下就没有问题。这个问题究其根本是因为默认情况下Windows中文环境是采用GBK编码,源程序文件HelloWorldScene.cpp 编码默认也是 GBK,如果源程序代码中有中文,它的字符集是GBK,需要将中文字符GBK 编码 转为 UTF-8 编码。

为此,添加一个MyUtility类,并在 MyUtility类中编写编码转化函数gbk_2_utf8。该函数是静态函数,不需要实例化MyUtility类就可以直接使用。

它 的作用是将 GBK格式编码转化成UTF8.

 //// MyUtility.h  文件
 #ifndef _MY_UTILITY_H_
 #define _MY_UTILITY_H_
 #include "cocos2d.h"

 using namespace std;

 class MyUtility
 {
 public:
     static string getCurrentTime();
     static string gbk_2_utf8(const string text);
 };

 #endif   // _MY_UTILITY_H_
 ////  MyUtility.cpp  文件
 #include "MyUtility.h"

 string MyUtility::getCurrentTime()
 {
     time_t t;
     time(&t);
     ] = {  };
     strftime(tmp, sizeof(tmp), "%Y-%m-%d %X", localtime((&t)));
     string timeStr = tmp;
     return timeStr;
 }

 /// 在win32平台下,将 GBK 编码 转为 UTF-8
 string MyUtility::gbk_2_utf8(const string text)
 {
 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
     //采用 Lambda表达式,将 string 转换成 wstring . Lambda表达式,通俗的解释就是,一个匿名函数.
     wstring tes = [=]()
     {
         setlocale(LC_ALL, "chs");
         const char* _Source = text.c_str();
         size_t _Dsize = text.size() + ;
         wchar_t* _Dest = new wchar_t[_Dsize];
         wmemset(_Dest, , _Dsize);
         mbstowcs(_Dest, _Source, _Dsize);
         std::wstring result = _Dest;
         delete[] _Dest;
         setlocale(LC_ALL, "C");
         return result;
     }();

     , tes.c_str(), tes.size(), NULL, , NULL, NULL);
     )
     {
         return string();
     }

     char* resultString = new char[asciSize];
     , tes.c_str(), tes.size(), resultString, asciSize, NULL, NULL);
     if (conveResult != asciSize)
     {
         return string();
     }
     string buff = "";
     buff.append(resultString, asciSize);

     delete[] resultString;
     return buff;

 #else
     return text;
 #endif 

 }
 ///  HelloWorldScene.cpp  中的代码片段

     /// 日志中乱码问题
     __String* strLog = __String::create("hello, 晚上好! Everyone!");
     const char* cns;
 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
     std::string sns = MyUtility::gbk_2_utf8(strLog->getCString());
     cns = sns.c_str();
 #else
     cns = strLog->getCString();
 #endif
     log("%s", cns);

cocos2d-x实战 C++卷 学习笔记--第4章 win32平台下中文乱码问题的更多相关文章

  1. cocos2d-x实战 C++卷 学习笔记--第4章 字符串 __String类

    前言: <cocos2d-x实战C++卷>学习笔记.(cocos2d-x 是3.0版本) 介绍 cocos2d-x 通用的字符串类  __String . 使用cocos2d::__Str ...

  2. cocos2d-x实战 C++卷 学习笔记--第7章 动作、特效(一)

    前言: 介绍cocos2d-x中的动作.特效. 动作: 动作(action)包括基本动作和基本动作的组合,这些基本动作有缩放.移动.旋转等,而且这些动作变化的速度也可以设定. 动作类是 Action. ...

  3. cocos2d-x实战 C++卷 学习笔记--第6章 场景与层

    前言: 一个场景(Scene)是由多个层(Layer)组成,而且层的个数要至少是1,不能为0. 场景切换 场景切换相关函数 1)void  runWithScene(Scene*  scene) 该函 ...

  4. cocos2d-x实战 C++卷 学习笔记--第4章 使用菜单

    前言: 菜单中包含菜单项,菜单项类是 MenuItem ,每个菜单项都有三个基本状态:正常.选中和禁止. (MenuItem)菜单分类: (文本菜单)MenuItemLabel : MenuItemA ...

  5. cocos2d-x实战 C++卷 学习笔记--第5章 精灵

    前言: 精灵类是Sprite类.它的子类有PhysicsSprite 和 Skin. PhysicsSprite 是物理引擎精灵类,而Skin是皮肤精灵类,用于骨骼动画. 创建Sprite精灵对象 创 ...

  6. cocos2d-x实战 C++卷 学习笔记--第4章 使用标签

    前言: 介绍cocos2d-x中 标签类. cocos2d-x中 标签类 主要有三种:LabelTTF, LabelAtlas, 和 LabelBMFont.此外,在Cocos2d-x 3.x之后推出 ...

  7. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver

    1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...

  8. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  9. Spring实战第八章学习笔记————使用Spring Web Flow

    Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...

随机推荐

  1. PJax在jQuery 3.0无法运行问题修复

    PJax在jQuery 3.0无法运行 [现象] 页面报错:Uncaught TypeError: Cannot read property 'push' of undefined [原因] jQue ...

  2. java实现生产者消费者问题

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  3. Select-Object用法

    展开 modules 属性的详细信息 get-process |? {$_.processname -eq "cmd"}|select -ExpandProperty module ...

  4. Android 编程下 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 报错

    使用了极光推送的 jar 包项目在从 SVN 中检出后,假设不又一次对 jar 包和 Bulid Path 进行配置就会抛出 java.lang.NoClassDefFoundError: cn.jp ...

  5. Upcase 将edit1中的每个字符串改为首字母大写

    //将edit1中的每个字符串改为首字母大写 procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin    with ...

  6. Oracle DB 执行表空间时间点恢复

    • 列出在执行表空间时间点恢复(TSPITR) 时会发生的操作 • 阐释TSPITR 使用的术语的定义 • 确定适合将TSPITR 用作解决方案的情况 • 确定时间点恢复的正确目标时间 • 确定不能使 ...

  7. cocos2d-x读取xml(适用于cocos2d-x 2.0以上版本号)

    为了能在cocos2d-x的文本标签中显示中文,一个是转换文件编码格式,还有一种就是读取utf-8格式的xml文件.我选择了后者,其原因大家可以去搜索一下cocos2d-x显示中文,希望可以你给答案. ...

  8. 设计模式-工厂方法(Demo)

    工厂方法 工厂方法跟简单工厂一样.都是创建型的设计模式.他攻克了简单工厂的违背开放封闭的缺点. 故事 主人--人家做饭好累的.女仆抱着我大腿说着.自从上次把她买进家.没做了几次饭就喊累--看着她那出处 ...

  9. careercup-中等难度 17.8

    17.8 给定一个整数数组(有正数和负数),找出总和最大的连续序列,并返回总和. 解法: 就是求连续子序列的和最大,不过存在一个问题: 假设整个数组都是负数,怎么样才是正确的行为呢?看看这个简单的数组 ...

  10. php一些技术要点连接地址

    http基本认证: http://www.php.net/manual/zh/features.http-auth.php