zoukankan      html  css  js  c++  java
  • cocos2dx中使用iconv转码(win32,iOS,Android)


    首先贴下环境:Win7 64, NDK r8e, libiconv-1.14, cygwin


    一 Win32环境配置

    Cocos2D-X自带有win32上的iconv库。仅仅须要配置一下就可以使用。

    1 引入头文件

    属性->配置属性->C/C++->附加包括文件夹:
    $(ProjectDir)........cocos2dxplatform hird_partywin32iconv


    2 引入静态库:libiconv.lib

    属性->配置属性->连接器->输入->附加依赖项:
    libiconv.lib


    3 定义一个公用转码函数

    #include "iconv.h"
    
    
    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))
    	{
    		CCLog("ERROR: unable to open libiconv.");
    		return false;
    	}
    
    
    	mutant = iconv(oConv, &in, &in_left, &out, &out_left );
    	iconv_close(oConv);
    	if(mutant == (size_t)(-1))
    	{
    		CCLog("ERROR: unable to convert anything.");
    		return false;
    	}
    	converted = dest_len - out_left;
    	CCLog("to convert %u characters, %u mutanted , %u converted 
    ",src_len,mutant,converted);
    	dest_ptr[converted]='';
    
    
    	return true;
    }

    4 測试

    void convertTest()
    {
    	char inStr[] = "Hello, 这是个測试程序";
    	char outStr[1024];
    	iconv_convert(&inStr, sizeof(inStr), "GBK", &outStr, sizeof(outStr), "UTF-8");
    	CCLog("scr string:%s
    ", inStr);
    	CCLog("dst string:%s
    ", outStr);
    }


    输出结果:
    to convert 22 characters, 0 mutanted , 29 converted 
    scr string:Hello, ????

    ????????
    dst string:Hello, 这是个測试程序


    5 跨平台头文件包括设置

    win32按如上方法,设置头文件包括路径和依赖库。然后才干#include "iconv.h";
    iOS上自带libiconv.dylib,仅仅需#include <iconv.h>就可以;
    Android上须要另外编译,接下来我们会说;

    #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 "icov/iconv.h"
    #endif


    二 为Android编译iconv

    android下就不能直接使用cocos2d-x提供的iconv库,须要下载一个已经在linux环境下编译好的iconv库。

    1 下载

    从官网下载libiconv-1.14.tar.gz包。重命名为libiconv,解压。
    官网下载地址:http://www.fsf.org/resources/


    2 编译

    打开cygwin。进入libiconv根文件夹,运行:
    ./configure --build=x86_64-pc-linux-gnu --host=arm-linux-eabi

    切记此处不是./configure。不然到后面会报一大堆stdio.h里面的错。


    然后运行:
    make

    假设你之前make过了。须要先运行:
    make clean

    然后再运行make

    3 拷贝头文件

    将cocos2dxplatform hird_partywin32下的icov文件夹复制到项目的根文件夹下。跟Class同级

    4 配置

    4.1 拷贝libiconv 到project

    将libiconv放置在cocos2d-x-2.1.4根文件夹下


    4.2 编译配置 

    在libiconv文件夹下新建一个Android.mk文件,内容例如以下:

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := iconv_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)

    4.3 改动项目的Android.mk

    a 加入搜索路径

    将我们拷贝过来的iconv加入的头文件搜索路径中
    LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../Classes/iconv


    b 加入iconv_static

    LOCAL_WHOLE_STATIC_LIBRARIES += iconv_static
    iconv_static是在iconv中的Android.mk中的LOCAL_MODULE的值


    c 包括iconv子模块

    导入我们在iconv中定义的Android.mk
    $(call import-module,libiconv)


    三 常见错误

    1 langinfo.h: No such file or directory

    改动libiconv/libcharset/config.h文件里的宏定义:
    #define HAVE_LANGINFO_CODESET 1 

    #define HAVE_LANGINFO_CODESET 0
    另:切记切记勿用百度。坑死。搜不到想要的。都做程序猿了,还是想办法用谷歌吧。


    2 'c' undeclared

    改动文件/libcharset/lib/localcharset.c中函数get_charset_aliases (void),
    搜索int c;放到到函数体开头。




    附录:

    其它博客參考
    http://blog.csdn.net/smileyuping/article/details/9635365
    http://xwrwc.blog.163.com/blog/static/4632000320138151017187/
    http://blog.csdn.net/alex_my/article/details/10567541
    http://blog.csdn.net/victoryckl/article/details/7089823
  • 相关阅读:
    C/C++内存管理 笔记
    RAII惯用法:C++资源管理的利器
    JS、Flash 实现复制功能 (浏览器兼容)
    JS页面刷新实现方法总结
    php 一些常用的语句
    使用ZeroClipboard解决跨浏览器复制到剪贴板的问题
    window.opener.location.reload() and href()的区别 弹出页修改后刷新父窗体
    查看Mysql数据库大小
    JQUERY操作集锦
    十进制正整数转换成六十二进制
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7237527.html
Copyright © 2011-2022 走看看