您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx使用iconv 多国语言要用到开源字符转换

2014-08-14 11:26 246 查看
本文转自新浪微博:点击打开链接

1.下载

在windows上用iconv.dll,在IOS上系统有提供这个库,导入就可以,在android上要自己去下一个。

http://ftp.gnu.org/pub/gnu/libiconv/

这个是官网地址,目前iconv最新版本是1.14,2011.8.7版本的,大小4.8M

官方地址:

http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

2.下载完毕,解压放到Engine目录下,改名为iconv,和cocos2dx,CocosDenshion,extensions等同目录

3.在iconv目录下增加Android.mk文件,写入

LOCAL_PATH:= $(call my-dir)

#libiconv.so

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. 在工程的Android.mk里修改,加入这个lib和include目录(下面的路径要根据项目实际情况修改)

LOCAL_C_INCLUDES := $(LOCAL_PATH) \


$(LOCAL_PATH)/../../../../../Engine/iconv/include \

$(LOCAL_PATH)/../../../../../Engine/iconv/libcharset \

$(LOCAL_PATH)/../../../../../Engine/iconv/lib \

$(LOCAL_PATH)/../../../../../Engine/iconv/libcharset/include \

$(LOCAL_PATH)/../../../../../Engine/iconv/srclib \

$(LOCAL_PATH)/../../../../../Engine/iconv \

#================================

LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static

LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static

LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static

LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
LOCAL_WHOLE_STATIC_LIBRARIES += iconv_static

LOCAL_CFLAGS := $(MYCOMPILE_FLAG)

include $(BUILD_SHARED_LIBRARY)

$(call import-module,cocos2dx)

$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)

$(call import-module,CocosDenshion/android)

$(call import-module,extensions)

$(call import-module,external/Box2D)

$(call import-module,external/chipmunk)
$(call import-module,iconv)

5。网上很多教程都说到这里,但实际上,如果这个时候进行编译,问题还一大堆。

1)iconv.h不存在,在ivonv/include/有 iconv.h.in, iconv.h.build.in,就是没看到iconv.h

把iconv.h.in改名成iconv.h,发现编译很多错误

主要错误是类型不匹配,还有很多@符号。

因此需要进行修改。主要改法是不存在的改成存在的,@符号去掉

下面是我自己改完之后的iconv.h文件。编译OK.颜色的是修改的(本来完整的,但是发出来后注释和include好像被新浪给吃没了)

#ifndef _LIBICONV_H

#define _LIBICONV_H

#define _LIBICONV_VERSION 0x010E
extern int _libiconv_version;

#undef iconv_t

#define iconv_t libiconv_t

typedef void* iconv_t;

#include

#include

#ifndef EILSEQ


#define EILSEQ 84
#endif

#ifdef __cplusplus

extern "C" {

#endif

#ifndef LIBICONV_PLUG

#define iconv_open libiconv_open

#endif

extern iconv_t iconv_open (const char* tocode, const char* fromcode);

#ifndef LIBICONV_PLUG

#define iconv libiconv

#endif

extern size_t iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);//iconv.c要相应修改

#ifndef LIBICONV_PLUG

#define iconv_close libiconv_close

#endif

extern int iconv_close (iconv_t cd);

#ifdef __cplusplus

}

#endif

#ifndef LIBICONV_PLUG

#if USE_MBSTATE_T

#if BROKEN_WCHAR_H


#include

#include

#include

#endif

#include

#endif

#ifdef __cplusplus

extern "C" {

#endif

typedef struct {
void* dummy1[28];
#if USE_MBSTATE_T
mbstate_t dummy2;

#endif

} iconv_allocation_t;

#define iconv_open_into libiconv_open_into

extern int iconv_open_into (const char* tocode, const char* fromcode,
iconv_allocation_t* resultp);

#define iconvctl libiconvctl

extern int iconvctl (iconv_t cd, int request, void* argument);

typedef void (*iconv_unicode_char_hook) (unsigned int uc, void* data);

typedef void (*iconv_wide_char_hook) (wchar_t wc, void* data);

struct iconv_hooks {
iconv_unicode_char_hook uc_hook;
iconv_wide_char_hook wc_hook;
void* data;

};

typedef void (*iconv_unicode_mb_to_uc_fallback)
(const char* inbuf, size_t inbufsize,
void (*write_replacement) (const unsigned int *buf, size_t buflen,
void* callback_arg),
void* callback_arg,
void* data);

typedef void (*iconv_unicode_uc_to_mb_fallback)
(unsigned int code,
void (*write_replacement) (const char *buf, size_t buflen,
void* callback_arg),
void* callback_arg,
void* data);
#if HAVE_WCHAR_T


typedef void (*iconv_wchar_mb_to_wc_fallback)
(const char* inbuf, size_t inbufsize,
void (*write_replacement) (const wchar_t *buf, size_t buflen,
void* callback_arg),
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x 多语言
相关文章推荐