cocos2d-x学习笔记(八)使用NDK自带的iconv进行编码转换-创新互联

    cocos2d-x显示中文乱码最常用的解决方式主要有xml文件读取、使用iconv库。由于在使用iconv库出现了比较多的问题,这里作个总结,给后来人少走一些弯路。

在海宁等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、成都做网站 网站设计制作按需开发网站,公司网站建设,企业网站建设,品牌网站制作,成都全网营销,成都外贸网站制作,海宁网站建设费用合理。

    我用的是cocos2d-x 3.4的版本,我也是参照网上的教程,但可能一些细节教程里面没有提到,这里就详细列出来。

  1、在cocos2d-x端新建一个ChineseString.h文件

代码如下:

#ifndef __ChineseString_H__ #define __ChineseString_H__ #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "../../../software/android-ndk-r10e/sources/android/support/include/iconv.h" #endif #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) #include "external/win32-specific/icon/include/iconv.h" #endif #include  #pragma comment(lib, "libiconv.lib") static char g_GBKConvUTF8Buf[5000] = {0}; class ChineseString { public: static const char* GBKToUTF8(char *strChar) { iconv_t  iconvH; iconvH = iconv_open("utf-8", "gb2312"); if(iconvH == 0) { return NULL; } size_t strLength = strlen(strChar); size_t outLength = strLength * 4; size_t copyLength = outLength; memset(g_GBKConvUTF8Buf, 0, 5000); char* outbuf = (char*)malloc(outLength); char* pBuff = outbuf; memset(outbuf, 0, outLength); if (-1 == iconv(iconvH, &strChar, &strLength, &outbuf, &outLength))   {   iconv_close(iconvH);   return NULL;   }   memcpy(g_GBKConvUTF8Buf,pBuff,copyLength);   free(pBuff);   iconv_close(iconvH);   return g_GBKConvUTF8Buf; } }; #endif

    2、Android端

    网上有一种方法要自己下载iconv库,我觉得那种方法挺麻烦的,而且我自己跟着步骤试了下,没有成功,后面放弃了,最后又找了一种方法,也就是下面要介绍的用NDK自带的iconv库。

    我用的是android-ndk-r10e,可以发现有个iconv.h文件,也就是上面cocos2d-x端代码里引用的路径

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "../../../software/android-ndk-r10e/sources/android/support/include/iconv.h" #endif

这个根据自己ndk存放的路径做调整。

然后修改proj.android/jni目录下的Android.mk文件

主要加了

LOCAL_STATIC_LIBRARIES += android_support$(call import-module, android/support)

在相应的地方加入这两段代码

cocos2d-x学习笔记(八)使用NDK自带的iconv进行编码转换

做了以上这些步骤,正常情况下是可以通过了。

注意以下几点:

1、android编译碰到如下错误

invalid conversion from 'const char**' to 'char**' 

这是由于我们定义GBKToUTF8这个函数时,参数使用const char* strChar,然后传入iconv函数时ndk的iconv.h定义的是size_t  iconv(iconv_t, char**, size_t*, char**, size_t*); 所以只需要把const去掉就ok了。

2、网上有介绍说ndk r9的iconv.h代码有问题,需要修改如下,大家注意一下就行,r10是没有这个问题

//将#ifdef __cplus_plus   //改为   #ifdef __cplusplus   }  // extern "C"   #endif

 

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站栏目:cocos2d-x学习笔记(八)使用NDK自带的iconv进行编码转换-创新互联
转载注明:http://scyanting.com/article/dhdsio.html