您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x 中文输出 GB2312与UFT8互转

2014-04-21 12:02 232 查看
刚刚入门cocos2d-x的时候,第一个运行的项目就是"hello world",但是想打印出"你好世界"是不是发现输出的都是乱码?

原因就是c默认的编码是GB2312,但是现在我们的程序使用的是UTF8编码.

现在有两个办法解决中文正确输出的问题:

第一种办法

点击你要保存的文件,

点击文件下的高级保存选项,

将编码改为UTF-8带签名,就可以了.

下面我们来说第二种办法

1.在你的cocos2d的目录下搜索iconv文件夹,这个文件夹中的内容是这样的



将这个文件夹复制到你的cocos2d的根目录下.

2.在项目的附加包含目录中加入$(SolutionDir)iconv\include;(如果是新的生成办法则加入$(ProjectDir)..\..\..\iconv\include;)

3.在项目的附加依赖项中加入libiconv.lib;

4.贴代码啦~

.h

#ifndef _CTRANSCODING_H_
#define _CTRANSCODING_H_

#include "iconv.h"
#include "cocos2d.h"
#include "platform/third_party/win32/iconv/iconv.h"
USING_NS_CC;

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
#pragma comment(lib,"libiconv.lib")
#endif

int UtF_8(char* from_charset, char* to_charset, char* intbuf, size_t inlen, char* outbuf, size_t outlen);

char* a2u(const char* ipt,bool g_u = true);

#endif


.cpp

#include "CTranscoding.h"

int UtF_8(char* from_charset, char* to_charset, char* intbuf, size_t inlen, char* outbuf, size_t outlen)
{
iconv_t iconvH;
iconvH = iconv_open(to_charset, from_charset);
if (!iconvH)
return 0;
memset(outbuf, 0, outlen);

#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
char* temp = intbuf;
char** pin = &temp;
char** pout = &outbuf;

if (!iconv(iconvH, pin, &inlen, pout, &outlen))
{
iconv_close(iconvH);
return 0;
}
#else
if (!iconv(iconvH, &intbuf, &inlen, &outbuf, &outlen))
{
iconv_close(iconvH);
return 0;
}
#endif
iconv_close(iconvH);
return 0;
}

char* a2u(const char* ipt,bool g_u)
{
char buf[1024] = {};
memcpy(buf,ipt,(int)strlen(ipt));
memset(my_output,0,1024);
if(buf[0] == 0)
{
my_output[0] = ' ';
return my_output;
}
size_t inlen = strlen(buf);
size_t outlen = inlen << 1;
if(g_u)
UtF_8("gb2312", "utf-8",buf, inlen, my_output, outlen);
else
UtF_8("utf-8", "gb2312",buf, inlen, my_output, outlen);

//my_output是一个全局char* 我开了1024,这个可以根据项目对中文需求的长度来设定,因为重复需求,所以定义全局会比较方便
return my_output;
}


贴一个使用方法吧

CCLabelTTF* mylabel = CCLabelTTF::create(a2u("你好世界"), "Arial", 18);
mylabel->setPosition(ccp(200 , 200));
this->addChild(mylabel);


结束了? NONONO,现在仅仅是在PC上运行OK,现在还无法编译出 .so文件,所以下面我们要修改Android.mk

直接打开mk修改就好了

添加

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \

                    $(LOCAL_PATH)/../../iconv/include \
   $(LOCAL_PATH)/../../iconv/libcharset \
   $(LOCAL_PATH)/../../iocnv/libcharset/lib \
   $(LOCAL_PATH)/../../iocnv/libcharset/include \
   $(LOCAL_PATH)/../../iconv \
   $(LOCAL_PATH)/../../libiconv/lib \
   $(LOCAL_PATH)/../../libiconv/srclib

LOCAL_WHOLE_STATIC_LIBRARIES := libiconv cocos2dx_static cocosdenshion_static cocos_extension_static

$(call import-module,iconv) \

ok,搞定,到你的手机上运行看看吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息