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

本文转自新浪微博:点击打开链接

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),
void* callback_arg,
void* data);

typedef void (*iconv_wchar_wc_to_mb_fallback)
(wchar_t code,
void (*write_replacement) (const char *buf, size_t buflen,
void* callback_arg),
void* callback_arg,
void* data);
#else

typedef void (*iconv_wchar_mb_to_wc_fallback) ();
typedef void (*iconv_wchar_wc_to_mb_fallback) ();
#endif

struct iconv_fallbacks {
iconv_unicode_mb_to_uc_fallback mb_to_uc_fallback;
iconv_unicode_uc_to_mb_fallback uc_to_mb_fallback;
iconv_wchar_mb_to_wc_fallback mb_to_wc_fallback;
iconv_wchar_wc_to_mb_fallback wc_to_mb_fallback;
void* data;
};


#define ICONV_TRIVIALP 0
#define ICONV_GET_TRANSLITERATE 1
#define ICONV_SET_TRANSLITERATE 2
#define ICONV_GET_DISCARD_ILSEQ 3
#define ICONV_SET_DISCARD_ILSEQ 4
#define ICONV_SET_HOOKS 5
#define ICONV_SET_FALLBACKS 6


#define iconvlist libiconvlist
extern void iconvlist (int (*do_one) (unsigned int namescount,
const char * const * names,
void* data),
void* data);


extern const char * iconv_canonicalize (const char * name);


extern void libiconv_set_relocation_prefix (const char *orig_prefix,
const char *curr_prefix);

#ifdef __cplusplus
}
#endif

#endif


#endif

6. localcharset.c修改

get_charset_aliases()里面

1)(line136 左右)

dir = relocate ("c");//chenhd 2014.02 modify (LIBDIR);


2)line 165

fd = open (file_name,
O_RDONLY | (1 ? O_NOFOLLOW : 0));//(HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值