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

一 Win32环境配置

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

1 引入头文件

属性->配置属性->C/C++->附加包括文件夹:

$(ProjectDir)..\..\..\..\cocos2dx\platform\third_party\win32\iconv

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 \n",src_len,mutant,converted);
dest_ptr[converted]='\0'; 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\n", inStr);
CCLog("dst string:%s\n", 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 拷贝头文件

将cocos2dx\platform\third_party\win32下的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

cocos2dx中使用iconv转码(win32,iOS,Android)的更多相关文章

  1. 关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug

    这个文章的名字起的实在是有点长,主要是怕说不清楚. 在IOS上,输入时,我看到过的比较少,就两种,如附件两张图.一个是虚拟键盘的输入框完全是在CCEditBox上,另一张虚拟键盘的输入区域是紧挨着键盘 ...

  2. 一个二维码-->网址-->iOS/Android跳转

    view-source:https://dpx.shopo.com.cn/down.html lmxmn117:~ will.wei$ curl https://dpx.shopo.com.cn/do ...

  3. 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)

    本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.a ...

  4. Cocos2d-x在win32,android和IOS下的文件读写问题

    最近在学习和使用Cocos2d-x框架,虽然说的是跨平台,但是在用VS进行开发,然后移植到android或IOS下,也可能会出现各种问题,需要做细微的调整. 例如我在做文件读写操作的时候,很可能在wi ...

  5. spa(单页应用)中,使用history模式时,微信长按识别二维码在ios下失效的问题

    spa(单页应用,vue)中,使用history模式时,微信长按识别二维码在ios下失效的问题. 触发条件: spa单页应用: 路由模式 history 从其他页面跳转到带有微信二维码识别的页面(不是 ...

  6. cocos2d_x iconv转码

    作者:何卫 转载请注明,原文链接:http://www.cnblogs.com/hewei2012/p/3374147.html iconv下载(Android) 源码下载地址,已编译完的iconv包 ...

  7. cocos2dx中加入unzip

    作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037323.html  cocos2dx中没有直接解压文件的,自己网上找了个,记录一下. ...

  8. Cocos2d-x中SQLite数据库管理工具

    数据库创建完成后,我们可能需要看看数据库中数据是否成功插入,很多人喜欢使用图形界面工具来管理SQLite数据库.SQLite图形界面管理工具有很多,我推荐使用SQLiteStudio工具,下载地址ht ...

  9. 【转载】cocos2dx 中 Android NDK 加载动态库的问题

     原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...

随机推荐

  1. Python之数据结构:列表

    列表:处理一组有序项目的数据结构 一.基本操作 1.列表运算符 list1=[2,3,4,5,6,7,8] print len(list1) print [1,2]+[3,4] print ['Hi' ...

  2. 汽车加油行驶(cogs 737)

    «问题描述:给定一个N*N 的方形网格,设其左上角为起点◎,坐标为(1,1),X 轴向右为正,Y轴向下为正,每个方格边长为1,如图所示.一辆汽车从起点◎出发驶向右下角终点▲,其坐标为(N,N).在若干 ...

  3. struts 中继承ActionSupport类

    理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承 com.opensymphony.xwork2.ActionSuppo ...

  4. java 仓库maven

    工具: apache-maven-3.2.3.zip maven_data.zip 在java Window->Preferences->Maven中 Installations中添加ap ...

  5. Android修改包名的方法,简单粗暴。

    几分钟之内,简单粗暴的修改包名! 序:Android的新手玩家可能对修改包名这件事情很是烦恼,我这里给出一个最快的修改包名的方法,简单粗暴,喜欢的可以收藏一下. 开始修改 第一步:修改自己app mo ...

  6. IOS view的圆角和阴影并存

    记录一下这个简单但又难搞的问题,如何设置 view的圆角和阴影并存 UIView *v=[[UIView alloc]initWithFrame:CGRectMake(10, 10, 100, 100 ...

  7. asp.net core 开发环境自定义域名及端口

    web项目上右键-> 选择属性-> 选择调试->编辑“应用url” ,再用vs启动web项目即可实现自定义url. 值得注意的是如果报“visual studio无法连接到iis e ...

  8. python 安装cx_Oracle模块, MySQLdb模块, Tornado

    一,想访问远程Oracle数据库,本地又不想安装几百兆的Oracle Client(也木有root权限),安装python的cx_Oralce 模块需要依赖Oracle Instant Client ...

  9. (19)python scrapy框架

    安装scrapy pycharm 建个纯python工程 settings里 环境变量设置 C:\Python27;C:\Python27\Scripts; 下载win32api https://so ...

  10. TopCoder SRM 660 Div2 Problem 1000 Powerit (积性函数)

    令$f(x) = x^{2^{k}-1}$,我们可以在$O(k)$的时间内求出$f(x)$. 如果对$1$到$n$都跑一遍这个求解过程,时间复杂度$O(kn)$,在规定时间内无法通过. 所以需要优化. ...