您好,登錄后才能下訂單哦!
cocos2d-x顯示中文亂碼最常用的解決方式主要有xml文件讀取、使用iconv庫。由于在使用iconv庫出現(xiàn)了比較多的問題,這里作個總結(jié),給后來人少走一些彎路。
我用的是cocos2d-x 3.4的版本,我也是參照網(wǎng)上的教程,但可能一些細節(jié)教程里面沒有提到,這里就詳細列出來。
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> #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端
網(wǎng)上有一種方法要自己下載iconv庫,我覺得那種方法挺麻煩的,而且我自己跟著步驟試了下,沒有成功,后面放棄了,最后又找了一種方法,也就是下面要介紹的用NDK自帶的iconv庫。
我用的是android-ndk-r10e,可以發(fā)現(xiàn)有個iconv.h文件,也就是上面cocos2d-x端代碼里引用的路徑
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "../../../software/android-ndk-r10e/sources/android/support/include/iconv.h" #endif
這個根據(jù)自己ndk存放的路徑做調(diào)整。
然后修改proj.android/jni目錄下的Android.mk文件
主要加了
LOCAL_STATIC_LIBRARIES += android_support
$(call import-module, android/support)
在相應(yīng)的地方加入這兩段代碼
做了以上這些步驟,正常情況下是可以通過了。
注意以下幾點:
1、android編譯碰到如下錯誤
invalid conversion from 'const char**' to 'char**'
這是由于我們定義GBKToUTF8這個函數(shù)時,參數(shù)使用const char* strChar,然后傳入iconv函數(shù)時ndk的iconv.h定義的是size_t iconv(iconv_t, char**, size_t*, char**, size_t*); 所以只需要把const去掉就ok了。
2、網(wǎng)上有介紹說ndk r9的iconv.h代碼有問題,需要修改如下,大家注意一下就行,r10是沒有這個問題
//將#ifdef __cplus_plus //改為 #ifdef __cplusplus } // extern "C" #endif
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。