cocos2d-x实战 C++卷 学习笔记--第4章 win32平台下中文乱码问题
前言:
将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平台下中文乱码问题的更多相关文章
- cocos2d-x实战 C++卷 学习笔记--第4章 字符串 __String类
前言: <cocos2d-x实战C++卷>学习笔记.(cocos2d-x 是3.0版本) 介绍 cocos2d-x 通用的字符串类 __String . 使用cocos2d::__Str ...
- cocos2d-x实战 C++卷 学习笔记--第7章 动作、特效(一)
前言: 介绍cocos2d-x中的动作.特效. 动作: 动作(action)包括基本动作和基本动作的组合,这些基本动作有缩放.移动.旋转等,而且这些动作变化的速度也可以设定. 动作类是 Action. ...
- cocos2d-x实战 C++卷 学习笔记--第6章 场景与层
前言: 一个场景(Scene)是由多个层(Layer)组成,而且层的个数要至少是1,不能为0. 场景切换 场景切换相关函数 1)void runWithScene(Scene* scene) 该函 ...
- cocos2d-x实战 C++卷 学习笔记--第4章 使用菜单
前言: 菜单中包含菜单项,菜单项类是 MenuItem ,每个菜单项都有三个基本状态:正常.选中和禁止. (MenuItem)菜单分类: (文本菜单)MenuItemLabel : MenuItemA ...
- cocos2d-x实战 C++卷 学习笔记--第5章 精灵
前言: 精灵类是Sprite类.它的子类有PhysicsSprite 和 Skin. PhysicsSprite 是物理引擎精灵类,而Skin是皮肤精灵类,用于骨骼动画. 创建Sprite精灵对象 创 ...
- cocos2d-x实战 C++卷 学习笔记--第4章 使用标签
前言: 介绍cocos2d-x中 标签类. cocos2d-x中 标签类 主要有三种:LabelTTF, LabelAtlas, 和 LabelBMFont.此外,在Cocos2d-x 3.x之后推出 ...
- Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver
1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...
- Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥
1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...
- Spring实战第八章学习笔记————使用Spring Web Flow
Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...
随机推荐
- 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 ...
- pcb原理图注意问题大汇总
1. 元器件之间连线用Wire(■)命令而不是用Line( /)命令,虽然从表面上看,两者都是直线,只是颜色稍有些不同,但用Wire(■)命令放置的导线是具有电气特性的,而用Line(/)命令放置的直 ...
- 退出程序是跳过屏幕自检 比如 必输 EXIT-COMMAND
控制必须输入可以,但是我退出程序的时候还要求我输入个值才能退出,这太变态了,相信很多同志都在SAP程序中反感过这个问题. 标准程序咱就不说了,忍了,新开发的功能还是要解决这个问题. 办法很简单:MOD ...
- 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 ...
- UIView上添加了一个按钮和一个单击手势的事件相应,互相不影响的处理方法。。
tapGesture.delegate = self; - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shoul ...
- send,recv,sendto,recvfrom
send函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是server应用程序都用se ...
- C语言register关键字—最快的关键字
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对.你想想,一个CPU 的寄存器也就那么几个或几十个,你要是 ...
- 项目源码--Android高质量图片浏览器源码
下载源码 技术要点: 1. 浏览所有格式的图片 2. 图片缓存到数据库 3. Sqlite数据库的高级应用 4. 文件夹缩图显示 5. 多点触控技术 6. 动画技术 7. 支持超高清图片 8. ...
- [原创] 对于深度学习(deep learning)在工业界的应用现状和突破 [by matthewbai]
现状: 1. 目前大家对于大部分需求,通常采用multiple layer,units in each layer也是人工订好的(虽然可以做稀疏,但是在same layer范围内竞争). 2. 网络结 ...
- Java基础知识强化之多线程笔记05:Java程序运行原理 和 JVM的启动是多线程的吗
1. Java程序运行原理: Java 命令会启动Java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程.该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 m ...