cocos2d-x学习笔记(八)使用NDK自带的iconv进行编码转换
admin
2023-02-12 01:00:03
0

    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

 




相关内容

热门资讯

斯里兰卡前高官之子,涉嫌抢劫中... 斯里兰卡警方近期披露,当地破获一起抢劫案,涉案人员5人,涉案金额高达2000万卢比(约合人民币40余...
每日科普 | 量子包治百病?什... 市面上量子手环、量子水杯、量子床垫、量子理疗仪等产品满天飞,商家张口就宣称量子能量可以疏通经络、根除...
上海AI产业交答卷:以生态之力... 上海人工智能产业交答卷:真实产线上淬炼硬核能力 聚合产业推进中国算力体系化 以生态之力,加速AI拐点...
“郑州造”光伏清洁机器人即将交... 7月22日,郑州航空港经济综合实验区坤达产业园内,两台C1光伏清洁机器人正在进行交付前的最后测试。作...
腾讯整合Workbuddy与Q... 快科技7月21日消息 ,据媒体报道,腾讯近日发布内部组织调整通知,将 QClaw产品中心全部相关业务...
TVB正式更名,宣布由传统电视... 7月24日,@TVB官方微博发文官宣TVB更名“无线集团”,TVB表示,由传统电视台升级为跨媒体娱乐...
2026WAIC观察丨白辰甲:... 图片来源/新华社 ■中国经济时报记者 张一鸣 王彩娜 在人工智能浪潮下,具身智能的演变之路也在加速。...
澳大利亚工党大会上,中方官员愤... 据澳大利亚广播公司(ABC)7月23日报道,中国外交官因不满台湾地区代表出席澳大利亚工党(ALP)在...
裸体在家犯法还是拍别人裸照犯法... 近日,#男子在家裸体被邻居拍照发群#一事引发热议。据报道,某小区一名男业主在家中未穿衣物,对面女业主...
“每天跟遛狗一样”,万亿资金,... 进入7月,市场波动加大,A股关于量化交易的争议再次达到顶峰。由于散户与量化机构之间的“体感温差”显著...