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<string> #pragmacomment(lib,"libiconv.lib") staticcharg_GBKConvUTF8Buf[5000]={0}; classChineseString { public: staticconstchar*GBKToUTF8(char*strChar) { iconv_ticonvH; iconvH=iconv_open("utf-8","gb2312"); if(iconvH==0) { returnNULL; } size_tstrLength=strlen(strChar); size_toutLength=strLength*4; size_tcopyLength=outLength; memset(g_GBKConvUTF8Buf,5000); char*outbuf=(char*)malloc(outLength); char*pBuff=outbuf; memset(outbuf,outLength); if(-1==iconv(iconvH,&strChar,&strLength,&outbuf,&outLength)) { iconv_close(iconvH); returnNULL; } memcpy(g_GBKConvUTF8Buf,pBuff,copyLength); free(pBuff); iconv_close(iconvH); returng_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 $(callimport-module,android/support) 在相应的地方加入这两段代码 做了以上这些步骤,正常情况下是可以通过了。 注意以下几点: 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*,size_t*); 所以只需要把const去掉就ok了。 2、网上有介绍说ndk r9的iconv.h代码有问题,需要修改如下,大家注意一下就行,r10是没有这个问题 //将#ifdef__cplus_plus //改为 #ifdef__cplusplus }//extern"C" #endif (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |