cocos2dx中使用iconv转码(win32,iOS,Android)

首先贴下环境: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 到工程

将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

时间: 2024-12-21 20:13:43

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

关于linux中的iconv转码

在Linux中iconv是一个用来转码的命令,在将数据文件导入到数据库中的时候经经常会遇到,数据文件的字符编码格式和数据库中要求的字符编码格式不一致,这时就会经常用到iconv这个命令 iconv  常用参数 -f 原编码-t 目标编码-c 忽略无法转换的字符 将GBK格式文件(test1.txt)转换成UTF-8格式文件(test2.txt) iconv -c -f GBK -c UTF-8 test.txt > test2.txt 注:此时文件test1并没有删除 iconv有时会和另外一个

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

本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.android实现自绘日期选择控件 目的: 通过一个相对复杂的自定义自绘控件来分享: 1.ios以及android自定义自绘控件的开发流程 2.objc与c/c++混合编程 3.android ndk的环境配置,android studio ndk的编译模式,swig在android ndk开发中的作

Cocos2d-X手游源码/iOS/Android/cocos2dx源码/AppStore/手游资源“集中营”

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏开发程序猿加班熬夜伤脑筋伤身体,花钱买技术,不如买游戏源代码. 节省开发周期和大量资金投入(工资.测试.学习),可以腾出大量时间精力和女友约会聊天,放松心情! 现在放出多套精品游戏cocos2d-x源代码. 大小游戏可以换皮上线!可学习 二次开发! 完整可编译,游戏体验安装包在网盘里放着,需要的看看. 店铺

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

spa(单页应用,vue)中,使用history模式时,微信长按识别二维码在ios下失效的问题. 触发条件: spa单页应用: 路由模式 history 从其他页面跳转到带有微信二维码识别的页面(不是直接打开该页面) ios版本的微信(实测版本6.5.19) 结果: 二维码长按无法识别,刷新页面后恢复正常,安卓下正常. 解决方案: 1. 进入该页面的方式不使用路由跳转,而改为 <a href="xxx">目标二维码页面</a>的方式: 2. 在beforeCre

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

数据库创建完成后,我们可能需要看看数据库中数据是否成功插入,很多人喜欢使用图形界面工具来管理SQLite数据库.SQLite图形界面管理工具有很多,我推荐使用SQLiteStudio工具,下载地址http://sqlitestudio.pl/?act=download.SQLiteStudio工具支持跨平台,支持多国语言,包括中文.可以导出各种SQL.CSV.HTML和XML等格式.启动SQLiteStudio工具,如图所示界面,通过菜单"数据库"→"添加数据库",

cocos2d-x 从win32到android移植的全套解决方案

引言:我们使用cocos2d-x引擎制作了一款飞行射击游戏,其中创新性地融入了手势识别功能.但是我们在移植过程中遇到了很多的问题,同时也发现网上的资料少而不全.所以在项目行将结束的时候,我们特地写了这篇文章来完整记录我们整个移植的过程,纪念我们项目的成功完成,更以此来表达对帮助过我们的人的感谢.移植过程中我们在网上得到了很多帮助,更要感谢黄杨学长在最后时刻帮助我们突破难关! 0.开发平台 系统:win8 profession 64bit IDE:vs2012 rtm, eclipse cocos

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

原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各个平台的SDK,遇到了不少问题,也从中了解了不少知识,之前一直觉得没啥好写的,毕竟做了4个月的游戏开发,也没有碰上什么真正的大问题,cocos2dx的引擎包得也很好,能让人把大部分时间都关注在游戏逻辑.效果的处理上,当然,之前的libevent还是小坑一下,但是和后来遇到的相比,也算不上什么了. 我最

小码哥iOS培训机构祝高考学子们旗开得胜

小码哥iOS培训机构祝高考学子们旗开得胜 三年磨一剑,今朝试锋芒,又是一年高考时,今天是6月7日,是全国统考的第一天,小码哥iOS培训机构倡议尽量少开车.不开车,车辆通过考场周围时,别按喇叭,别猛加速:不在学校及住宅区附近开展广场舞等高分贝活动.尽量给考生提供一个安静的考试环境,为考生助力护航! 众所周知,高考是高等学校选拔新生的制度,中国有1300多年科举考试的历史,这一制度曾显示出选拔人才的优越性,深深地影响了东亚各国.1905年,清廷出于发展新教育.培养实用人才的需要,废除了科举制度,转而

cocos2dx中的设计分辨率与屏幕适配策略

1.首先明确几个概念: 设计分辨率:designResolution,即资源图片的设计尺寸,即美工给你的资源图片的大小,比如(641*964) 屏幕分辨率:又叫帧的大小,glview->setFrameSize(480,640); 这是指你的设备的屏幕的大小,通常手机的屏幕分辨率也就那么几种固定的大小,如480*320,1024*768,等等,在win32模拟器,或其他模拟器中,也指模拟器屏幕的大小. 2.疑问,既然图片是为手机屏幕服务的,干嘛搞这么多概念,直接一切以屏幕为中心不就得了,所有资源