环境:cocos2dx 3.10
1.vs环境下编译windows版本,需要增加头文件和链接库
①cocos2d-x-3.10externalwin32-specificiconinclude
②cocos2d-x-3.10externalwin32-specificiconprebuilt
2.编译android版本,需要修改Android.mk文件增加iconv支持
①LOCAL_WHOLE_STATIC_LIBRARIES += android_support
②$(call import-module, android/support)
3.转换函数
1 #if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
2 #include "iconv.h"
3 #elif CC_TARGET_PLATFORM == CC_PLATFORM_IOS
4 #include <iconv.h>
5 #elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
6 #include "iconv.h"
7 #endif
8
9 int iconv_convert(void *src, unsigned int src_len, const char *src_charset, void *dest, unsigned int dest_len, const char *dest_charset)
10 {
11 int ret = -1;
12 iconv_t oConv = iconv_open(dest_charset, src_charset);
13 if (oConv == (iconv_t)(-1))
14 {
15 cocos2d::log("ERROR: unable to open libiconv.");
16 return ret;
17 }
18
19 #ifdef _WIN32
20 const char *in = (const char *)src;
21 #else
22 char *in = (char *)src;
23 #endif
24 char *out = (char *)dest;
25 size_t src_left = src_len, dest_left = dest_len;
26
27 //dest_len目标长度不够的话,会进入这里
28 //in_left表示还有多少长度输入没有转换,out_left表示还有长度输出剩余
29 if (iconv(oConv, &in, &src_left, &out, &dest_left) != (size_t)(-1)){
30 //返回转换了多少空间,用来计算剩余多少空间(可以用于确定写入 的位置;但是如果src中已经包含了 则无需再写入)
31 ret = dest_len - dest_left;
32 }
33
34 iconv_close(oConv);
35
36 return ret;
37 }
38
39 /*
40 //使用例子
41 char inStr[] = "China中国 Test";
42 char outStr[1024] = {};
43 if (iconv_convert(&inStr, sizeof(inStr), "GBK", &outStr, sizeof(outStr), "UTF-8") > 0){
44 Label* label1 = Label::createWithSystemFont(outStr, "fonts/arial.ttf", 24);
45 }
46 */