网络上一堆下载iconv库,添加进去。麻烦的要死,找了半天终于找到一篇添加NDK自带iconv.h的文章。
cocos2d-x显示中文乱码最常用的解决方式主要有xml文件读取、使用iconv库。由于在使用iconv库出现了比较多的问题,这里作个总结,给后来人少走一些弯路。
我用的是cocos2d-x 3.4的版本,我也是参照网上的教程,但可能一些细节教程里面没有提到,这里就详细列出来。
1、在cocos2d-x端新建一个ChineseString.h文件
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#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端
网上有一种方法要自己下载iconv库,我觉得那种方法挺麻烦的,而且我自己跟着步骤试了下,没有成功,后面放弃了,最后又找了一种方法,也就是下面要介绍的用NDK自带的iconv库。
我用的是android-ndk-r10e,可以发现有个iconv.h文件,也就是上面cocos2d-x端代码里引用的路径
1
2
3
|
#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文件
主要加了
1
|
LOCAL_STATIC_LIBRARIES += android_support
|
1
|
$(call import-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*, char**, size_t*); 所以只需要把const去掉就ok了。
2、网上有介绍说ndk r9的iconv.h代码有问题,需要修改如下,大家注意一下就行,r10是没有这个问题
1
2
3
4
5
|
//将#ifdef __cplus_plus
//改为
#ifdef __cplusplus
}
// extern "C"
#endif
|