前言:

将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. A Tour of Go Mutating Maps

    Insert or update an element in map m: m[key] = elem Retrieve an element: elem = m[key] Delete an ele ...

  2. pcb原理图注意问题大汇总

    1. 元器件之间连线用Wire(■)命令而不是用Line( /)命令,虽然从表面上看,两者都是直线,只是颜色稍有些不同,但用Wire(■)命令放置的导线是具有电气特性的,而用Line(/)命令放置的直 ...

  3. 退出程序是跳过屏幕自检 比如 必输 EXIT-COMMAND

    控制必须输入可以,但是我退出程序的时候还要求我输入个值才能退出,这太变态了,相信很多同志都在SAP程序中反感过这个问题. 标准程序咱就不说了,忍了,新开发的功能还是要解决这个问题. 办法很简单:MOD ...

  4. Codeforces Round #322 (Div. 2) B. Luxurious Houses 水题

    B. Luxurious Houses Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/pr ...

  5. UIView上添加了一个按钮和一个单击手势的事件相应,互相不影响的处理方法。。

    tapGesture.delegate = self; - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shoul ...

  6. send,recv,sendto,recvfrom

    send函数 int send( SOCKET s,    const char FAR *buf,    int len,    int flags ); 不论是客户还是server应用程序都用se ...

  7. C语言register关键字—最快的关键字

        register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对.你想想,一个CPU 的寄存器也就那么几个或几十个,你要是 ...

  8. 项目源码--Android高质量图片浏览器源码

      下载源码   技术要点: 1. 浏览所有格式的图片 2. 图片缓存到数据库 3. Sqlite数据库的高级应用 4. 文件夹缩图显示 5. 多点触控技术 6. 动画技术 7. 支持超高清图片 8. ...

  9. [原创] 对于深度学习(deep learning)在工业界的应用现状和突破 [by matthewbai]

    现状: 1. 目前大家对于大部分需求,通常采用multiple layer,units in each layer也是人工订好的(虽然可以做稀疏,但是在same layer范围内竞争). 2. 网络结 ...

  10. Java基础知识强化之多线程笔记05:Java程序运行原理 和 JVM的启动是多线程的吗

    1. Java程序运行原理:     Java 命令会启动Java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程.该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 m ...