cocos2dx如何显示中文
很高兴你来到泰课在线。在Cocos2d-x应用中,中文显示可能会出现异常。虽然Cocos2d-x是跨平台的2D游戏引擎,但目前我仅在Win32平台下使用VC进行学习。如果你在其他平台开发,本文可能帮助不大,建议你阅读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显示就会异常。
需要注意的是,这里所说的传入参数的编码,指的是程序运行时传入字符串的编码,而非源文件保存的编码。简单来讲,若使用2005/2008/2010版的VC开发,希望将UTF - 8编码的字符串硬编码到源代码中,且不使用像"\\xE6\\xB1\\x89"这种缺乏可读性的转义字符方案,就必须将文件保存为“无签名的UTF - 8”编码。
“无签名的UTF - 8”编码的副作用
然而,在VC上使用“无签名的UTF - 8”编码保存代码文件存在副作用。下面我们做个实验:新建一个“Win32 控制台应用程序”,添加如下代码:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
const char str[] = "退出";
return 0;
}
将文件保存为“无签名的UTF - 8”编码后进行编译。我使用的是Microsoft Visual C++ 2010学习版,编译输出如下:
>------ 已启动全部重新生成: 项目: utf-8-test, 配置: Debug Win32 ------
1> stdafx.cpp
1> utf-8-test.cpp
1>d:\\projects\\utf-8-test\\utf-8-test.cpp : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>d:\\projects\\utf-8-test\\utf-8-test.cpp(8): error C2001: 常量中有换行符
1>d:\\projects\\utf-8-test\\utf-8-test.cpp(9): error C2143: 语法错误 : 缺少“;”(在“return”的前面)
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
有个叫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引擎的学习,可暂时放弃使用中文,这样能节省不少时间。