下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Cocos2D-X基础教程:中文不显示的内在原因

作者:课课家教育     来源: http://www.kokojia.com点击数:826发布时间: 2019-04-22 15:43:43

标签: Cocos2D-X中文Cocos2D-X基础Cocos2D-X讨论

  关于Cocos2d-x不支持显示中文的问题,我相信很多初学的同学都会有这个疑问,现在我们通过这篇教程来详细了解一下这个问题的具体原因吧。

  虽然cocos2d-x是一个跨平台的2D游戏引擎,但是目前我只使用VC在Win32平台下学习她。如果你是在其他平台上做开发,那么这篇文章对你可能没有太大帮助,我建议你阅读cocos2d-x的代码,找出问题的关键,从而定制一个可行的解决方案。

  作为一名初学者,你必定像我一样跟着教程将代码敲进编辑器里,保存,编译,运行。却惊奇地发现中文字符串要么不显示了,要么显示成了乱码。心里想着,天啊,什么地方出问题了。然后打开百度、谷歌,搜索“cocos2d-x 中文”。于是你找到了解决方案,要把文件保存为“无签名的UTF-8”编码。

  按照上面的方法操作,编译,运行,这时你已经可以看到中文字符显示正常了。如果你还有别的什么重要的事情要做,没有时间听我在这里废话,那么你现在就可以点击窗口上的叉叉离开了。

  你还在这里?你还想听听为什么会这样吗?

  额。。。好吧,那我就简单说一下。以创建一个label为例,当我们使用

  CCLabelTTF * CCLabelTTF::labelWithString(const char *label, const char *fontName, float fontSize)

  来创建label的时候,实际上这里的const char *参数期望的是UTF-8编码的字符串(你可以查看CCImage_win32.cpp中BitmapDC的drawText函数来印证我的说法),如果传入一个非UTF-8编码的字符串,那么创建的label就会显示得不太正常。

  注意,这里所说的传入参数的编码是指程序运行时传入的字符串的编码,而不是源文件保存的编码。这实际上是一个编译器相关的问题,具体情况你可以通过这篇文章了解一下。http://blog.csdn.NET/darkdong/article/details/6067119

  简单来说,如果你使用2005/2008/2010版的VC做开发,希望将UTF-8编码的字符串硬编码到源代码中,并且不使用转义字符"\\xE6\\xB1\\x89"这种缺乏可读性的方案,那么你必须将文件保存为“无签名的UTF-8”编码。

  然而在VC上使用“无签名的UTF-8”编码保存代码文件是有毒副作用的。有兴趣的朋友可以跟我一起做个实验。

  新建一个“Win32 控制台应用程序”,然后添加如下代码:

  Cocos2D-X基础教程:中文不显示的内在原因_Cocos2D-X中文_Cocos2D-X基础_Cocos2D-X讨论_课课家

  然后将文件保存为“无签名的UTF-8”编码,编译。

  我用的是Microsoft Visual C++ 2010 学习版,输出:

 

  有个叫wva的人遇到过类似问题,他向微软提交了此bug

  根据Visual C++ Compiler Team员工的解释:

  The compiler when faced with a source file that does not have a BOM the compiler reads ahead a certain distance into the file to see if it can detect any Unicode characters - it specifically looks for UTF-16 and UTF-16BE - if it doesn't find either then it assumes that it has MBCS. I suspect that in this case that in this case it falls back to MBCS and this is what is causing the problem.

  看见了吧,对于那些没有BOM的文件设计就是这样的。从语气上看,他们编译器小组也不打算修改设计。所以呢,在VC上使用“无签名的UTF-8”编码的文件,你就是在抱着一颗不定时炸弹玩耍。因为你永远都不敢确定哪些词能通过编译,哪些不能!

  如果要硬编码字符串,即便是字符编码转换也不一定能帮不上你。一旦你为此增加了字符编码转换的代码,那么也意味着可移植性降低了。因为这从根本上是编译器决定的。

  所以如果你想要在你的cocos2d-x应用里使用中文,那么最好将它们存放到外部资源文件中去,然后提供一套文本资源获取接口。

  或者你仅仅是想像我一样快点儿开始cocos2d-x引擎的学习,那么暂时放弃中文吧,应该能省下不少时间。

赞(11)
踩(2)
分享到:
华为认证网络工程师 HCIE直播课视频教程