cocos2d Label无法正常显示中文

来源:互联网 发布:手游代练软件 编辑:程序博客网 时间:2024/05/01 03:57

我当初在用cocos2d做黑白棋的时候用label无法正常的输出中文,但是英语和数字符号都是能正常显示的。后来我去查了一下原来是编码的问题,用vs的时候一般编码是GBK,而cocos2d是用UTF-8。所以当我们在vs里写好程序运行的时候发现出来的中文是乱码的。下面我来介绍两种能正常显示中文的方法。
(1)使用iconv库来转换编码方式。使用的方法也很简单现在头文件里添加“iconv.h”然后再写一个转换函数,这个函数可以直接复制下面的代码直接用。

string GBKToUTF8(std::string gbkStr, const char* toCode, const char* formCode){iconv_t iconvH;iconvH = iconv_open(formCode, toCode);if (iconvH == 0){return 0;}const char* strChar = gbkStr.c_str();const char** pin = &strChar;size_t strLength = gbkStr.length();char* outbuf = (char*)malloc(strLength * 4);char* pBuff = outbuf;memset(outbuf, 0, strLength * 4);size_t outLength = strLength * 4;if (-1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength)){iconv_close(iconvH);return 0;}gbkStr = pBuff;iconv_close(iconvH);return gbkStr;}

使用的时候可以像我这样label1->setString(GBKToUTF8("黑子下", "gbk", "utf-8"))直接使用。

特别提醒一下上面提到的都是在win32下面的,若要移植到安卓下面的话去掉上面的东西不用任何转换就可以正常显示中文。

(2)使用XML文件

先看下我们的xml文件:

<dict>      <key>chinese1</key>      <string>美好的一天</string>      <key>japanese</key>      <string>良い一日を</string>      <key>spanish</key>      <string>Buen día</string>  </dict>  </plist>
然后再来看如何使用:

//利用CCDictionary来读取xml      CCDictionary *strings = CCDictionary::create("fonts/strings.xml");      //中文,日语,西班牙语:objectForKey根据key,获取对应的string      const char *chinese = ((CCString*)strings->objectForKey("chinese1"))->m_sString.c_str();      const char *japanese = ((CCString*)strings->objectForKey("japanese"))->m_sString.c_str();      const char *spanish = ((CCString*)strings->objectForKey("spanish"))->m_sString.c_str();        CCLabelBMFont *label1 = CCLabelBMFont::create(spanish, "fonts/arial-unicode-26.fnt");      addChild(label1);      label1->setPosition(ccp(s.width/2, s.height/4*3-20));        CCLabelBMFont *label2 = CCLabelBMFont::create(chinese, "fonts/arial-unicode-26.fnt");      addChild(label2);      label2->setPosition(ccp(s.width/2, s.height/4*2));        CCLabelBMFont *label3 = CCLabelBMFont::create(japanese, "fonts/arial-unicode-26.fnt");      addChild(label3);      label3->setPosition(ccp(s.width/2, s.height/4*1));  

补充,发现有更直接的方法.

#ifdef WIN32
#pragma execution_character_set("utf-8")
#endif


1 0