请选择 进入手机版 | 继续访问电脑版
查看: 3641|回复: 15

[教程] 关于如何在VS2013中让CALabel汉字不显示乱码的终极绝招

[复制链接]
最佳答案
0 
201103L 发表于 2015-1-15 23:32:36 | 显示全部楼层 |阅读模式
本帖最后由 201103L 于 2015-1-24 00:57 编辑

我们知道,CALabel的字符串使用的是UTF8编码,
通常在xcode下,直接CALabel *p = ...; p->setText("汉字"),显示汉字是没有任何问题的,
但是,在VS2013中却显示的是乱码。
很多人在群里面问了,我都答:请使用UTF8编码。
他说,我的文件是UTF8格式的啊。呵呵,没那么简单好吗,文件编码和字符串字面值编码是两个概念。

官方当然知道这个问题,也很好心地提供了一个宏,
#define UTF8(x) unicode_to_utf8( L##x ).c_str()
用来转换成UTF8字符串

这条宏内部实际上是一条函数调用,函数的原型是std::string inline unicode_to_utf8( const wchar_t *in );
这样子其实内部是有隐患的,那就是C++里面著名的“临时变量析构”问题,
即:你这里没有变量接收返回值,那么调用函数unicode_to_utf8得到的是一个临时的std::string,然后你又对这个临时变量调用它的成员函数,
结果是不可预料的,因为你不知道这个临时的std::string什么时候会析构,如果它析构了,那么.c_str()显然会是个野指针


一个稍微安全点的解决方案是,将宏改为
#define UTF8(x) CCString::create(unicode_to_utf8(L##x))->getCString()
这样一来,CCString是堆上创建的变量,他内部的std::string要到下一帧才会析构,可以规避上述问题

但是如果我要“跨帧”使用,那又该怎么办呢?这就是标题要讲的终极绝招:VS2013的一条预编译指令
#pragma execution_character_set("utf-8")
这下就可以放心地在VS2013里面p->setText("汉字"),p->setText("中文")了
由于它只是一条预编译指令,一般将这句放在include群后面就好了

点评

good啊!  发表于 2015-1-20 10:35

评分

参与人数 3声望 +15 铜板 +330 收起 理由
千千小童鞋 + 15 + 200 赞一个!
Slim + 100 很给力!
Top0 + 30 很给力!

查看全部评分

最佳答案
0 
Slim 发表于 2015-1-17 12:37:58 | 显示全部楼层
我来晚了,这个必须得顶 啊!
最佳答案
0 
theday7718 发表于 2015-1-17 13:32:05 | 显示全部楼层
这个必须顶起啊
最佳答案
0 
foggy 发表于 2015-1-20 11:23:41 | 显示全部楼层
我来学习了```但是还是不会用```哈哈``
最佳答案
0 
beargolden 发表于 2015-2-2 12:55:43 | 显示全部楼层
本帖最后由 beargolden 于 2015-2-2 12:57 编辑

想问下,在VS2013中加入#pragma execution_character_set("utf-8")可以显示中文,但在Android平台却没有任何中文显示

点评

说了这个只对VS2013起效,你又不是用VS2013来打包android的  发表于 2015-2-2 18:52
您需要登录后才可以回帖 登录 | 注册

本版积分规则

推荐阅读 More>

© 2001-2015 9秒社团

合作伙伴

公司简介 | 联系方式
COPYRIGHT©2015 ZHONGQINGLONGTU NETWORK CO.LTD ALL RIGHTS RESERVED.ICP备11023195号-4
北京中清龙图网络技术有限公司
返回顶部 返回列表