cocos2dx中使用iconv转码(win32,iOS,Android)
2023-09-27 14:23:28 时间
首先贴下环境: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_staticiconv_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
相关文章
- Android仿IOS的AssistiveTouch的控件EasyTouch实现
- phonegap(cordova) 自己定义插件代码篇(六)----android ,iOS 微信支付工具整合
- Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库
- Flutter通过MethodChannel实现Flutter 与Android iOS 的双向通信
- Android 判断手机是32位CPU还是64位CPU android.os.Build类字段含义
- Android Spinner 下拉列表与箭头的上下左右距离如何调整完整示例
- 如何在 Ubuntu 15.04 下创建一个可供 Android/iOS 连接的 AP
- Android service实例解析
- How to change in the Cocos2d-x project from landscape to portrait both in iOS and Android
- Chrome Apps将可以打包成iOS或Android应用
- Android开发之深入理解Android 7.0系统权限更改相关文档
- Android热修复升级探索——资源更新之新思路
- Android之利用EventBus进行消息传递
- Android Studio中新建和引用assets文件
- Android NDK对象的引用-全局引用,局部引用,弱引用
- Android 中文API (68) —— BluetoothClass.Service
- Android中内容观察者的使用---- ContentObserver类详解
- Android/IOS 微信及浏览器(h5)中唤起本地APP,唤起浮层,然后用外部浏览器打开唤起某本地APP
- 国外创业者分享之Android 与 iOS:猜猜哪个能让开发者赚得更多
- Python全新Flet框架或将打通iOS、Android、Macos和Windows多平台开发(Flet教程含3个完成项目源码)
- JavaScript_JS判断客户端是否是iOS或者Android
- Android内核三大核心功能之一AMS内部原理
- 如何让Android和iOS应用下载共用一个二维码及遇到的坑
- lazarus 2016 2月18 4:22:35 支持android开发了, 既ios,linux,macosx,window,web 后 囊括一切啦。 哈哈
- Android微信支付SDK开发
- 史上最强黑客程序从iOS蔓延至Android