前言:

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

简要介绍:

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

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

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

  1. //// MyUtility.h 文件
  2. #ifndef _MY_UTILITY_H_
  3. #define _MY_UTILITY_H_
  4. #include "cocos2d.h"
  5.  
  6. using namespace std;
  7.  
  8. class MyUtility
  9. {
  10. public:
  11. static string getCurrentTime();
  12. static string gbk_2_utf8(const string text);
  13. };
  14.  
  15. #endif // _MY_UTILITY_H_
  1. //// MyUtility.cpp 文件
  2. #include "MyUtility.h"
  3.  
  4. string MyUtility::getCurrentTime()
  5. {
  6. time_t t;
  7. time(&t);
  8. ] = { };
  9. strftime(tmp, sizeof(tmp), "%Y-%m-%d %X", localtime((&t)));
  10. string timeStr = tmp;
  11. return timeStr;
  12. }
  13.  
  14. /// 在win32平台下,将 GBK 编码 转为 UTF-8
  15. string MyUtility::gbk_2_utf8(const string text)
  16. {
  17. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
  18. //采用 Lambda表达式,将 string 转换成 wstring . Lambda表达式,通俗的解释就是,一个匿名函数.
  19. wstring tes = [=]()
  20. {
  21. setlocale(LC_ALL, "chs");
  22. const char* _Source = text.c_str();
  23. size_t _Dsize = text.size() + ;
  24. wchar_t* _Dest = new wchar_t[_Dsize];
  25. wmemset(_Dest, , _Dsize);
  26. mbstowcs(_Dest, _Source, _Dsize);
  27. std::wstring result = _Dest;
  28. delete[] _Dest;
  29. setlocale(LC_ALL, "C");
  30. return result;
  31. }();
  32.  
  33. , tes.c_str(), tes.size(), NULL, , NULL, NULL);
  34. )
  35. {
  36. return string();
  37. }
  38.  
  39. char* resultString = new char[asciSize];
  40. , tes.c_str(), tes.size(), resultString, asciSize, NULL, NULL);
  41. if (conveResult != asciSize)
  42. {
  43. return string();
  44. }
  45. string buff = "";
  46. buff.append(resultString, asciSize);
  47.  
  48. delete[] resultString;
  49. return buff;
  50.  
  51. #else
  52. return text;
  53. #endif
  54.  
  55. }
  1. /// HelloWorldScene.cpp 中的代码片段
  2.  
  3. /// 日志中乱码问题
  4. __String* strLog = __String::create("hello, 晚上好! Everyone!");
  5. const char* cns;
  6. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
  7. std::string sns = MyUtility::gbk_2_utf8(strLog->getCString());
  8. cns = sns.c_str();
  9. #else
  10. cns = strLog->getCString();
  11. #endif
  12. 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. light oj 1008 - Fibsieve`s Fantabulous Birthday

    1008 - Fibsieve`s Fantabulous Birthday   PDF (English) Statistics Forum Time Limit: 0.5 second(s) Me ...

  2. [iOS基础控件 - 6.6.1] 展示团购数据代码

      1.主控制器: // // ViewController.m // GroupPurchase // // Created by hellovoidworld on 14/12/3. // Cop ...

  3. Web 应用的安全性

    Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户授权 ...

  4. 也谈SSO,一个简单实用的单点登录Demo

    关于SSO(单点登录),百度百科解释如下 : “SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要 ...

  5. pyinstaller打包第一个wxPython程序HelloWorld

    pyinstaller 打包hello 7Mb ================= www.pyinstaller.org pip install pypiwin32 pip install pyin ...

  6. iOS中的深复制与浅复制

    很多语言中都有深复制浅复制的概念,如C++,ObjC等.简单来说,浅复制就是两个变量指向了同一块内存区域,深复制就是两个变量指向了不同的内存区域,但是两个内存区域里面的内容是一样的. 浅复制示意图: ...

  7. Nuget控制台 - 给你的快速添加缺少的包

    利用命令行安装包

  8. Rank of Tetris(hdu1811拓扑排序+并查集)

    题意:关于Rating的信息.这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rati ...

  9. ORACLE 毫秒与日期的相互转换

    毫秒转换为日期 SELECT TO_CHAR(1406538765000 / (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY- ...

  10. [Practical Git] Clean up commits with git rebase

    Sometimes its nice to clean up commits before merging them into your main code repo; in this lesson, ...