cocos2dx libiconv 转码

iconv下载(Android)已编译完的iconv包(用这个即可)

ios自带libiconv,只需#include <iconv.h>即可 

步骤

1.libiconv解压文件放置

直接将解压的libiconv文件夹放在cocos2dx游戏引擎cocos2d-x-2.1.4目录下

写Android.mk放到libiconv根目录下

LOCAL_PATH:= $(call my-dir)
#libiconv.so
include $(CLEAR_VARS)
LOCAL_MODULE := libiconv_static

LOCAL_MODULE_FILENAME := libiconv
LOCAL_CFLAGS := \
  -Wno-multichar \
  -DAndroid \
  -DLIBDIR="c" \
  -DBUILDING_LIBICONV \
  -DIN_LIBRARY
LOCAL_SRC_FILES := \
  libcharset/lib/localcharset.c \
  lib/iconv.c \
  lib/relocatable.c
LOCAL_C_INCLUDES += \
  $(LOCAL_PATH)/include \
  $(LOCAL_PATH)/libcharset \
  $(LOCAL_PATH)/lib \
  $(LOCAL_PATH)/libcharset/include \
  $(LOCAL_PATH)/srclib
include $(BUILD_STATIC_LIBRARY)

2.修改自己工程中的Andriod.mk文件

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static libiconv_static
            
include $(BUILD_SHARED_LIBRARY)

$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
$(call import-module,extensions) \
$(call import-module,libiconv)

 

蓝色为变化的内容,与1.上面的蓝色对应。

3.iconv.h头文件拷贝

将程序中cocos2dx\platform\third_party\win32目录下的iconv文件夹拷贝到自己工程的Classes目录下

4.程序修改

.h文件

#include <string>
#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
#include "iconv/iconv.h"
#elif CC_TARGET_PLATFORM == CC_PLATFORM_IOS
#include <iconv.h>
#elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#include "iconv/iconv.h"
#endif




/*---------------------------------------------------*/
// iconv转码
/*---------------------------------------------------*/
static int code_convert( const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen );
static std::string u2a( const char *inbuf );
static std::string a2u( const char *inbuf );

 

 .cpp文件

 

int CCommonTool::code_convert( const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen )
 {
     iconv_t cd;
     const char *temp = inbuf;
     const char **pin = &temp;
     char **pout = &outbuf;
     memset(outbuf,0,outlen);
     cd = iconv_open(to_charset,from_charset);
     if(cd==0) return -1;
     if(iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
     iconv_close(cd);
     return 0;
 }

 /*UTF8 To GB2312*/
 string CCommonTool::u2a( const char *inbuf )
 {
     size_t inlen = strlen(inbuf);
     char * outbuf = new char[inlen * 2 + 2];
     string strRet;
     if(code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
     {
         strRet = outbuf;
     }
     delete [] outbuf;
     return strRet;
 }

 /*GB2312 To UTF8*/
 string CCommonTool::a2u( const char *inbuf )
 {
     size_t inlen = strlen(inbuf);
     char * outbuf = new char[inlen * 2 + 2];
     string strRet;
     if(code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
     {
         strRet = outbuf;
     }
     delete [] outbuf;
     return strRet;
 }

程序使用

CCString ccStr;
ccStr.m_sString = CCommonTool::a2u(ccStr.m_sString.c_str());

 

Demo

CCommonTool.h

#ifndef __CCOMMONTOOL_SCENE_H__
#define    __CCOMMONTOOL_SCENE_H__

#include <string>
#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
#include "iconv/iconv.h"
#elif CC_TARGET_PLATFORM == CC_PLATFORM_IOS
#include <iconv.h>
#elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#include "iconv/iconv.h"
#endif


class CCommonTool
{
public:

    /*---------------------------------------------------*/
    // iconv转码
    /*---------------------------------------------------*/
    static int code_convert( const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen );
    static std::string u2a( const char *inbuf );
    static std::string a2u( const char *inbuf );
};

#endif

CCommonTool.cpp

#include "CommonTool.h"

using  namespace  std;


int CCommonTool::code_convert( const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen )
{
    iconv_t cd;
    const char *temp = inbuf;
    const char **pin = &temp;
    char **pout = &outbuf;
    memset(outbuf,0,outlen);
    cd = iconv_open(to_charset,from_charset);
    if(cd==0) return -1;
    if(iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
    iconv_close(cd);
    return 0;
}

/*UTF8 To GB2312*/
string CCommonTool::u2a( const char *inbuf )
{
    size_t inlen = strlen(inbuf);
    char * outbuf = new char[inlen * 2 + 2];
    string strRet;
    if(code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
    {
        strRet = outbuf;
    }
    delete [] outbuf;
    return strRet;
}

/*GB2312 To UTF8*/
string CCommonTool::a2u( const char *inbuf )
{
    size_t inlen = strlen(inbuf);
    char * outbuf = new char[inlen * 2 + 2];
    string strRet;
    if(code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
    {
        strRet = outbuf;
    }
    delete [] outbuf;
    return strRet;
}

TinyXmlDemo.h

#ifndef __TINYXMLDEMO_SCENE_H__
#define __TINYXMLDEMO_SCENE_H__

#include "cocos2d.h"

class TinyXmlDemo : public cocos2d::CCLayer
{
public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();  

    // there's no 'id' in cpp, so we recommand to return the exactly class pointer
    static cocos2d::CCScene* scene();

    // a selector callback
    void menuCloseCallback(CCObject* pSender);

    static void parseTinyXMLFile();
    

    // implement the "static node()" method manually
    CREATE_FUNC(TinyXmlDemo);
};

#endif

TinyXmlDemo.cpp

#include "TinyXmlDemo.h"
#include "CommonTool.h"

using namespace cocos2d;
using namespace tinyxml2;

CCScene* TinyXmlDemo::scene()
{
    CCScene * scene = NULL;
    do 
    {
        scene = CCScene::create();
        CC_BREAK_IF(! scene);


        TinyXmlDemo *layer = TinyXmlDemo::create();
        CC_BREAK_IF(! layer);

        scene->addChild(layer);
    } while (0);

    return scene;
}

bool TinyXmlDemo::init()
{
    bool bRet = false;
    do 
    {

        CC_BREAK_IF(! CCLayer::init());

        TinyXmlDemo::parseTinyXMLFile();

        bRet = true;
    } while (0);

    return bRet;
}

void TinyXmlDemo::menuCloseCallback(CCObject* pSender)
{
    
}

void TinyXmlDemo::parseTinyXMLFile()
{

    char inStr[] = "Hello, 这是个测试程序";
    std::string outStr = CCommonTool::a2u(inStr);

    CCLog("scr string:%s\n", inStr);
    CCLog("dst string:%s\n", outStr.c_str());

}

输出:

 

原文链接:http://www.cnblogs.com/hewei2012/p/3374147.html

转载于:https://www.cnblogs.com/ycclmy/p/4272613.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Box2D和Cocos2D是两个游戏开发框架。Box2D是一个用于物理模拟的开源库,可以模拟刚体的运动和碰撞等物理效果。Cocos2D是一个用于2D游戏开发的跨平台框架,提供了丰富的图形渲染和用户交互功能。\[1\] 在使用Cocos2D和Box2D进行游戏开发时,你可以利用Box2D来处理游戏中的物理效果,比如重力、碰撞和刚体运动等。Cocos2D提供了与Box2D的集成,使得开发者可以方便地在Cocos2D中使用Box2D的功能。你可以通过创建物理世界、添加刚体和设置碰撞检测等来实现游戏中的物理效果。\[2\] 如果你刚刚接触Cocos2D和Box2D,建议你先学习Cocos2D和Box2D的基础知识,然后再深入学习如何在Cocos2D中使用Box2D。你可以参考一些入门教程,比如《Cocos2D入门》和《Box2D入门》。如果你对OpenGL ES 2.0和自定义Cocos2D 2.X着色器等背景知识感到困惑,你可以查阅相关教程来获取更多的帮助。\[3\] #### 引用[.reference_title] - *1* *3* [如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏-第1部分](https://blog.csdn.net/kaka626/article/details/9397825)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [用Box2D和cocos2d-x制作弹弓类游戏](https://blog.csdn.net/qq55008307/article/details/8090839)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值