zoukankan      html  css  js  c++  java
  • 将iconv编译成lua接口

    前一篇博文说了。在cocos2dx中怎么样使用iconv转码,这节我们将上一节中写的转码函数,做成一个lua接口。在lua脚本中使用。


    网上能够下载到luaconv。可是编译的时候总是报错,所以自己写了一接口。

    一 加入lua接口文件

    // luaiconv.h

    #ifndef __LUA_ICONV_H__
    #define __LUA_ICONV_H__
    
    
    #include "tolua++.h"
    #include "tolua_event.h"
    #include "lauxlib.h"
    
    
    #if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
    #include "iconv.h"
    #elif CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    #include <iconv.h>
    #elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
    #include "iconv.h"
    #endif
    
    
    int tolua_iconv_open(lua_State *L);
    
    
    #endif


    //luaiconv.cpp
    #include "luaiconv.h"
    #include <stdlib.h>
    
    
    #define MAX_STRING_SIZE 1024
    #define TEST_STR ("Hello, 这是个转码測试字符串")
    
    
    bool iconv_convert(void *src, unsigned int src_len,char *src_charset, void *dest, unsigned int dest_len, char *dest_charset)
    {
    	const char *in;
    	char *out,*dest_ptr;
    	size_t in_left,out_left,mutant,converted;
    
    
    	in_left = src_len;
    	out_left = dest_len;
    	in = (char *)src;
    	out = dest_ptr = (char *)dest;
    
    
    	iconv_t oConv=iconv_open(dest_charset,src_charset);
    	if(oConv==(iconv_t)(-1)){
    		printf("XXXXXXXXXX ERROR: unable to open libiconv.
    ");
    		return false;
    	}
    
    
    	mutant = iconv(oConv, &in, &in_left, &out, &out_left );
    	iconv_close(oConv);
    
    
    	if(mutant == (size_t)(-1)){
    		printf("XXXXXXXXXX ERROR: unable to convert anything.
    ");
    		return false;
    	}
    	converted = dest_len - out_left;
    	dest_ptr[converted]='';
    
    
    	printf("XXXXXXXXXX src string:%s
    ", src);
    	printf("XXXXXXXXXX to convert %u characters, %u mutanted , %u converted 
    ",src_len,mutant,converted);
    	printf("XXXXXXXXXX dst string:%s
    ", dest);
    
    
    	return true;
    }
    
    
    void convertTest()
    {
    	char inStr[] = TEST_STR;
    	char outStr[MAX_STRING_SIZE];
    	iconv_convert(&inStr, sizeof(inStr), "GBK", &outStr, sizeof(outStr), "UTF-8");
    	printf("XXXXXXXXXX in string:%s
    ", inStr);
    	printf("XXXXXXXXXX out string:%s
    ", outStr);
    }
    
    
    TOLUA_API int luaiconv(lua_State *L)
    {	
    	char *inbuf = (char*) luaL_checkstring(L, 1);
    	char *src_charset = (char*) luaL_checkstring(L, 2);
    	char *dst_charset = (char*) luaL_checkstring(L, 3);
    
    
    	size_t ibleft = lua_strlen(L, 1);
    	size_t obleft = (ibleft > 256) ? ibleft : 256; 
    	char *outbuf = (char*) malloc(obleft * sizeof(char));
        if (outbuf == NULL) {
            lua_pushstring(L, "");
            return 1;
        }
    	
    	if(!iconv_convert(inbuf, ibleft, src_charset, outbuf, obleft, dst_charset)){
    		lua_pushstring(L, "");
    		return 1;
    	}
    	
        lua_pushstring(L, outbuf);
        free(outbuf);
    	
        return 1;
    }
    
    
    static luaL_Reg iconvlib[] = {
    	{"luaiconv", luaiconv},
    	{NULL, NULL}
    };
    
    
    // 函数名必须为luaopen_xxx,当中xxx表示library名称,Lua代码require "xxx"须要与之相应。
    int luaopen_iconv(lua_State* L)
    {
    	const char* libName = "iconv";
    	luaL_register(L, libName, iconvlib);// 调用方式libName.函数名
    
    
    	return 1;
    }
    
    
    int tolua_iconv_open(lua_State *L)
    {	
    	luaopen_iconv(L);
    	return 1;
    }
    


    在AppDelegate中

    #include "luaiconv.h"



    然后在AppDelegate::applicationDidFinishLaunching()中调用:

    CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
    CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
    tolua_iconv_open(pEngine->getLuaStack()->getLuaState());


    在lua中这样使用:
    require "iconv"
    iconv.luaiconv("string to convert code","GBK","UTF-8")


    二 改动项目的Android.mk

    LOCAL_SRC_FILES 中加上luaiconv.cpp 

    切记在末尾加上空格和续行符:" "

    否则有可能会报错:

    make: *** No rule to make target 'xxx.o', needed by 'xxx'. Stop

  • 相关阅读:
    【20171123】【GITC精华演讲】贝业新兄弟李济宏:如何做到企业信息化建设的加减乘除
    920记者招待会: 对话详解海尔张瑞敏首席的人单合一
    存货控制中的ABC分类释义
    对员工宽容的公司 都死掉了
    小型互联网公司的IT系统建设思路
    第三方物流是什么
    伟哥对RTO & RPO的通俗理解
    【20170506】贝业新兄弟IT总监李济宏:第三方家居物流的IT架构探索
    【Vegas原创】VirtualBox扩容、分割的整体方案
    数据通信基础(物理层)学习笔记
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6789312.html
Copyright © 2011-2022 走看看