首先贴下环境: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 := libiconvLOCAL_CFLAGS := \-Wno-multichar \-DAndroid \-DLIBDIR="c" \-DBUILDING_LIBICONV \-DIN_LIBRARYLOCAL_SRC_FILES := \libcharset/lib/localcharset.c \lib/iconv.c \lib/relocatable.cLOCAL_C_INCLUDES += \$(LOCAL_PATH)/include \$(LOCAL_PATH)/libcharset \$(LOCAL_PATH)/lib \$(LOCAL_PATH)/libcharset/include \$(LOCAL_PATH)/srclibinclude $(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

转载于:https://www.cnblogs.com/jhcelue/p/7237527.html

cocos2dx中使用iconv转码(win32,iOS,Android)相关推荐

  1. cocos2dx中加入unzip

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

  2. 【cocostudio】发布资源在Cocos2d-x中如何使用

    http://cn.cocos2d-x.org/tutorial/show?id=1945 1. 新版本的加载方式: 使用Cocos Studio 2.0发布的CSB资源更换了加载方式,需要用CSLo ...

  3. 【深入Cocos2d-x】探索Cocos2d-x中的内存管理-引用计数和自动释放池

    2019独角兽企业重金招聘Python工程师标准>>> #深入Cocos2d-x-探索Cocos2d-x中的内存管理-引用计数和自动释放池 ###引用计数(Reference Cou ...

  4. cocos2dx中的文字显示

    cocos2d-x 中添加显示文字的三种方式 LabelTTF .LabelBMFont 和 LabelAtlas 在 cocos2d-x 中有三个类可以在层或精灵中添加文字: LabelTTF La ...

  5. cocos2d-x中的curl

    将请求的接口的动作放在互斥锁中进行 1: 2: 3: pthread_mutex_t mutex; 4: pthread_t thread; 5: sem_t * m_structSem; 6: 7: ...

  6. cocos2d-x中几种存储数据的方式

    说明:本文所论述内容均基于cocos2dx 3.0 版本. 1.UserDefault 它是cocos2d-x用来存取基本数据类型用的.保存为XML文件格式. 查看CCUserDefault文件,可以 ...

  7. 跟着石头哥哥学cocos2d-x(四)--cocos2dx中的动画以及TexturePacker使用

    2019独角兽企业重金招聘Python工程师标准>>> 之前向Andreas Loew申请了一枚TexturePacker注册码,很快都下来了,作为回报我打算还是写一篇关于Textu ...

  8. cocos2d 嵌入网页_在 cocos2d-x 中嵌入浏览器

    在 cocos2d-x 中嵌入浏览器 次阅读 Embeds a browser in cocos2d-x 在游戏中嵌入网页是很常见的需求,cocos2d-x 引擎官方并没有提供这个功能. 我在网上转了 ...

  9. cocos2dx骨骼动画Armature源码分析(一)

    <!DOCTYPE html> 源码分析一 cocos2dx骨骼动画Armature源码分析(一) cocos2dx中的骨骼动画使用起来比较方便,从编辑器(cocostudio或flash ...

最新文章

  1. AVERAGE函数参数说明
  2. SAP MM初阶之事务代码MIGO界面里的HOLD
  3. 安装autoit libary失败问题解决
  4. (十)Java B2B2C o2o多用户商城 springcloud架构- SSO单点登录之OAuth2.0登录认证(1)
  5. Linux Swap空间利用率过高
  6. mysql 返回随机行_从mysql数据库返回随机行而不使用rand()
  7. ANTLR和StringTemplate
  8. 学习进度——第十二周
  9. 法语语音教学课件下载
  10. 基于JAVA小区生活服务平台的设计与实现计算机毕业设计源码+系统+lw文档+部署
  11. unity关于中文字体显示问题
  12. 笔记 - Front End - 新知识点归纳
  13. JQuary(从原生js到jq,就发现jq好简单)
  14. 路何去何从-第三方Oracle服务商
  15. eclipse离线安装PMD(含PMD离线包)
  16. nginx请求的11个阶段
  17. 【探索-字节跳动】字符串的排列
  18. 国家电网“SG186工程”介绍
  19. UML图/类图箭头末尾圆圈的含义
  20. 1403744-37-5,DSPE-PEG2000-Acid,DSPE-PEG2000-COOH

热门文章

  1. ASP.NET生成静态页面方法大全(3)
  2. 小波变换(wavelet transform)的通俗解释(二)
  3. Ubuntu16.04 sudo apt-get install lib***-dev安装失败,无法锁定文件,sudo apt-get update 更新失败也无法解决
  4. java串口助手_java 串口调试助手 源码
  5. Qt 中获取三种坐标类型
  6. html5 canvas签字,HTML5 canvas实现电子签名
  7. win10调节屏幕亮度_Win8系统笔记本电脑如何调节屏幕亮度?
  8. 差分进化算法_基于差分进化的水泥烧成系统动态优化算法
  9. 爬虫怎么处理python_python 爬虫怎么处理json内容
  10. 、简述global关键字的作用_在C#编程中global关键字的作用及其用法