今天上网搜了不少方法,不过也没实践多少,倒是找到一种适合自己的方法,通过调用函数来解决字符编码的问题,解决win32平台不能显示中文的问题。还有就是如何使用字体文件,代码如下。

字体和字符编码

#ifndef _GBKTOUTF8_H_
#define _GBKTOUTF8_H_
#include "cocos2d.h"
//包含这个头文件,iconv库是一个字符集转换的开源的库,cocos2dx支持的编码是UTF-8,
//在win32下使用的编码是GB2312,所以要转化一下,才能显示中文
#include "iconv\iconv.h"

//记住附加依赖项libiconv.lib或者使用以下的代码
//#pragma comment(lib, "libiconv.lib")

//就是一个函数没有分装成类
int GBKToUTF8(std::string & gbkStr, const char* toCode, const char* fromCode);

#endif

 

#include "GBKToUTF8.h"

//以下函数是从网上copy的,试了一下可以解决问题
int GBKToUTF8(std::string & gbkStr, const char* fromCode, const char* toCode)
{
	iconv_t iconvH;
	//这个函数调用的作用是将formCode的编码转换成toCode的编码,我们一般调用的时候是GB2312 UTF-8
	//因为系统又的编码支持有的不支持所以就有可能返回0
	iconvH = iconv_open(toCode,fromCode);

	//如果返回值为0代表不可以转化
	if (iconvH == 0)
	{
		return -1;
	}

	//将string类型转化为char *类型
	const char* strChar = gbkStr.c_str();
	//以下是基础不说了
	const char** pin = &strChar;
	size_t strLength = gbkStr.length();
	char* outbuf = (char*) malloc(strLength*4);
	char* pBuff = outbuf;

	//这里GB2312和UTF-8的位数是1:4不明白,知道的人说一下
	memset(outbuf, 0, strLength*4);
	size_t outLength = strLength*4;

	//第二个参数表示转化前字符的地址,以后的参数分别是转化前字符的长度,转化后的存储地址,转化后的长度
	if (-1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength))
	{
		free(pBuff);
		iconv_close(iconvH);
		return -1;
	}

	gbkStr = pBuff;
	iconv_close(iconvH);

	return 0;
}
#include "HelloWorldScene.h"
//用python建立的工程以下的包含可能有问题,请到工程的属性设置中附加包含目录,把路径写进去,其实就是个.
#include "GBKToUTF8.h"

USING_NS_CC;

CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();

    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
	//对字体文件的测试
	CCLabelTTF * ttf1 = CCLabelTTF::create("china","Marker Felt.ttf",24);
	//第二个参数加上字体文件的路径和名称
	CCLabelTTF * ttf2 = CCLabelTTF::create("0123456789","Paint Boy.ttf",24);
	ttf1->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
	ttf2->setPosition(ccp(visibleSize.width/2,visibleSize.height/4));
	this->addChild(ttf1);
	this->addChild(ttf2);

	//测试中文
	std::string str = "中文版的HelloWorld";
	GBKToUTF8(str,"GB2312","UTF-8");
	//没写字体的话就使用平台默认的字体
	CCLabelTTF * ttf3 = CCLabelTTF::create(str.c_str(),"",24);
	ttf3->setPosition(ccp(visibleSize.width/2,visibleSize.height*2/3));
	this->addChild(ttf3);

    return true;
}

这个项目移植android平台的时候会出现问题的,因为使用了第三方的库,我们需要采取一些措施才行,请参考我的文章cocos2dx使用了第三方库照样移植android平台-解决iconv库的移植问题。有问题欢迎留言。