[置顶] [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv

时间:2022-12-09 08:41:15

前言


    由于cocos2d-x内部是以utf8处理文本的,而VS直接输入时文本编码为GBK,所以在类似在CCLabelTTF等上显示中文时会出现乱码。     以下是解决该问题,较便捷的方法之一。

1. 在VS中给项目附加依赖项里加入libiconv.lib

    在VS“解决方案资源管理器”视图中——项目->属性->配置属性->连接器->输入->附加依赖项里填写“libiconv.lib”,多个lib以空格隔开(等同于“#pragma comment(lib, "libicon.lib")”语句)。
    [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv
    [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv          [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv


2.包含头文件iconv/iconv.h.,并通过这个库封装几个编码转换函数

   代码如下:
    

#include "iconv\iconv.h"
#include <iostream>
#include <cstring>

int code_convert(const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
iconv_t cd;
const char *temp = inbuf;
const char **pin = &temp;
char **pout = &outbuf;
memset(outbuf,0,outlen);
cd = iconv_open(to_charset,from_charset);
if(cd==0) return -1;
if(iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}

/*UTF8תΪGB2312*/
std::string u2a(const char *inbuf)
{
size_t inlen = strlen(inbuf);
char * outbuf = new char[inlen * 2 + 2];
std::string strRet;
if(code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
{
strRet = outbuf;
}
delete [] outbuf;
return strRet;
}

/*GB2312תΪUTF8*/
std::string a2u(const char *inbuf)
{
size_t inlen = strlen(inbuf);
char * outbuf = new char[inlen * 2 + 2];
std::string strRet;
if(code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
{
strRet = outbuf;
}
delete [] outbuf;
return strRet;
}

    然后在每次要使用中文前,用a2u函数将文本转换为utf-8编码,使用例程如下:
    char lifebuff[1024];
sprintf(lifebuff, "生命值:"); 
    lifeIndicator->setString(a2u(lifebuff).c_str());


   至此,在VS上Cocos2D-X项目可显示中文正常。
 
   上述方法,详细参见原文 http://hi.baidu.com/coofly/item/dcb911f363cba1763c198b7b



3.在中文乱码问题只是出现在VS上,如果把该CPP文件保存为utf-8编码格式,则在编译成android程序后,在eclipse上调试将不会出现乱码问题。

   文件->另存为->保存按钮的下拉按钮->选择编码格式为utf-8
    [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv      [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv      [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv

     

    如果不管VS上的乱码问题,无需做第二点的工作。直接将文件保存为utf-8编码格式,android项目即可在eclipse上编译成功并且可显示中文。


4.将Win32项目移植到Android上


  Cocos2D-X自带有win32上的iconv库,但是Android需要的不同,需要自行编译。这里提供一个已编译好的iconv库:http://download.csdn.net/detail/yupingliu/5842299
    下载成功后,将解压后的库文件放在cocos2d-x-2.1.4的根目录下      [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv            在新建的Android项目中(如何新建Cocos2D-X的Android项目),打开该目录下的pro.android/jni文件下的Android.mk文件(推荐使用UltraEdit,而不用windows自带的记事本)。修改如下:添加如下代码

LOCAL_C_INCLUDES +=$(LOCAL_PATH)/../../../iconv/include

 

LOCAL_SHARED_LIBRARIES :=libiconv

$(call import-module,iconv)

       [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv
      但是,尽管以上操作可以使Android项目在cygwin下编译时不会出错,但在eclipse上调试的时候,中文并不会显示出来。      目前我也没有找到原因,如果有读者有更好的解决方案,望分享,谢谢啦~~
      如果想在Android项目上显示中文,目前的方法是:牺牲VS为显示中文乱码(不使用iconv库),把对应的CPP文件另存为utf-8编码格式(详见上述第三点),使用普通的设置文本的方法(如CCLabelTTF* scoreIndicator = CCLabelTTF::create("分数", "Arial", 20);)。            这样,尽管在win32下是乱码,但是在android平台上还是可以显示中文了。

5.常见的编译错误


     如果读者仍然想使用iconv,在VS上成功显示中文字符,在做了第二步后,使用cygwin交叉编译将win32项目移植到android上时,可能会出现如下错误:
     1.fatal error: iconv\iconv.h: No such file or directory
     [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv             解决方案:将E:\cocos2d-x-2.1.4\cocos2d-x-2.1.4\(对应你的Cocos2D-X根目录)cocos2dx\platform\third_party\win32目录下的iconv文件夹复制到cocos2d-x-2.1.4根目录下的projects文件夹里你的项目中的pro.win文件夹里。      注意:是放在你引用了“iconv/iconv.h”的文件同目录下,这里我是在Tool.h里“#include "iconv/iconv.h"”,所以我讲iconv文件夹复制到了Tool.h同目录下。       [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv       [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv              
    2.error: sprintf_s was not declared in this scope         [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv
    sprintf_s是sprintf的安全模式,我不晓得有木有更好的解决方法,我目前的做法是把引用了sprintf_s的地方改成了sprintf。     (如果有读者有更好的解决方案,望分享,谢谢啦~~    如下:    [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv        3.error: undefined reference to 'libiconv_open'
   [置顶]        [Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv
   出错的原因是有可能是:在pro.android/jni文件下的Android.mk文件少添加了下面这句话——LOCAL_SHARED_LIBRARIES := libiconv (详见上述第4点)  
    

              本文不详尽或错误之处,请各位不吝言辞,多多指教~谢谢~

             作者:Louise http://blog.csdn.net/yupingliu