Cocos2d-x下使用iconv库

前端之家收集整理的这篇文章主要介绍了Cocos2d-x下使用iconv库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

  1. 原文:http://www.jb51.cc/article/p-ckkwowsn-ber.html@H_502_5@
  2. 近来在客户端搭建打包APK的环境,以及解决中文乱码问题。网上找了很多资料,但总是各种不详细,非常麻烦。因此在这里把自己的过程详细记录下,如果有哪步不详细,请留言。@H_502_5@

客户端使用的是cocos2d-x-2.0.4,是一个比较老的版本了。使用cygwin和eclipse交叉编译出APK包。@H_502_5@环境搭建另外写一篇文章,这边主要讲使用iconv库。很多人尝试在解决乱码问题时,也都会尝试使用iconv库,但因为遇到各种问题而放弃,比较常见的有找不到"iconv.h",或者是编译之后找不到iconv_open,iconv_close等函数。@H_502_5@

在这次使用iconv库的过程中,参考了一些文章,大家也可以移步去看看。@H_502_5@

http://bbs.csdn.net/topics/390285784?page=1#post-393310132@H_502_5@

http://codingnow.cn/cocos2d-x/1038.html@H_502_5@

最近找到另外一篇文章,讲的也不错也很简洁,也可以参考下(2014/02/25)@H_502_5@

http://blog.csdn.net/smileyuping/article/details/9635365@H_502_5@


乱码问题目前遇到的是写在客户端上的文字在真机上乱码,服务端发送到客户端的文字乱码。以前看到一篇文章,说有三种解决方案。@H_502_5@

1、客户端全部使用UTF-8文件。@H_502_5@

这种办法对于写在客户端上的文字还是挺有用的,但对于服务端发送过来的中文显示乱码了,但如果是单机还是挺推荐的。可以用宏定义的方法将固定的内容定义在某个文件,如果想发展国外市场版本,可以直接拿这个文件给翻译。@H_502_5@

2、使用iconv库。@H_502_5@

当时也尝试过,但总是遇到各种问题,加上进度问题,就放弃了,转而使用第1种方法。@H_502_5@

3、使用xml文件读取。@H_502_5@

这个对于单机游戏来说,也是不错的,省很多麻烦,特别是以后想发展国外市场需要多语言版的。配上rapidxml解析库,还是挺不错的。@H_502_5@

___________________________________________________________@H_502_5@

iconv的配置使用过程:@H_502_5@

1、默认是搭建好安卓打包环境的。@H_502_5@


@H_502_5@

2、下载iconv库。@H_502_5@

大家可以去官网上下载:http://ftp.gnu.org/pub/gnu/libiconv/@H_502_5@

网速不好的或者打不开的,可以到我的资源里边下载:@H_502_5@

http://download.csdn.net/detail/alex_my/6036049@H_502_5@

大家下载下来后,比如是libiconv-114,可以将文件重命名成iconv。@H_502_5@

3、解压iconv库@H_502_5@

大家将下载到的iconv库解压至项目根目录。也就是和cocos2dx,extensions这些库的同级目录。gameclient01是我的游戏代码,详情可以见Cocos2d-x 搭建安卓编译环境@H_502_5@

@H_502_5@

4、编写iconv库所需的Android.mk。@H_502_5@

这步要仔细看了,很多文章这步没写清楚,让我走了许多冤枉路。@H_502_5@

进入到刚才解压出的iconv文件夹,用记事本之类的建立一个Android.mk文件,这其实相当于linux的makefile文件。@H_502_5@

Android.mk内容:@H_502_5@

@H_502_5@

  1. LOCAL_PATH:=$(callmy-dir)@H_502_5@@H_502_5@
  2. #libiconv.so@H_502_5@@H_502_5@@H_502_5@
  3. include$(CLEAR_VARS)@H_502_5@
  4. @H_502_5@
  5. LOCAL_MODULE:=iconv_static@H_502_5@
  6. LOCAL_MODULE_FILENAME:=libiconv@H_502_5@
  7. LOCAL_CFLAGS:=\@H_502_5@
  8. -Wno-multichar\@H_502_5@
  9. -DAndroid\@H_502_5@
  10. -DLIBDIR="c"@H_502_5@\@H_502_5@@H_502_5@
  11. -DBUILDING_LIBICONV\@H_502_5@
  12. -DIN_LIBRARY@H_502_5@
  13. @H_502_5@
  14. LOCAL_SRC_FILES:=\@H_502_5@
  15. libcharset/lib/localcharset.c\@H_502_5@
  16. lib/iconv.c\@H_502_5@
  17. lib/relocatable.c@H_502_5@
  18. LOCAL_C_INCLUDES+=\@H_502_5@
  19. $(LOCAL_PATH)/include\@H_502_5@
  20. $(LOCAL_PATH)/libcharset\@H_502_5@
  21. $(LOCAL_PATH)/lib\@H_502_5@
  22. $(LOCAL_PATH)/libcharset/include\@H_502_5@
  23. $(LOCAL_PATH)/srclib@H_502_5@
  24. include$(BUILD_STATIC_LIBRARY)@H_502_5@

这部分不要写错了,大家尽量copy下来。@H_502_5@

5、编写Android项目里面的Android.mk文件。@H_502_5@

在搭建安卓编译环境的时候,大家写了一个Android.mk。这个相当于把所有库的Android.mk做了一个汇总。@H_502_5@

这个Android.mk位于gameclient01/proj.android/jni下。打开后,拉到尾部:@H_502_5@

这个尾部的内容原本是这样的:@H_502_5@

@H_502_5@

请大家修改成这样:@H_502_5@

红色部分是修改的地方。@H_502_5@

第一个红圈增加了一些路径依赖。只要大家以下两个文件是这么放的,路径就不会有错,就不用纠结于多少个../,当然,大家也可以直接写上绝对路径。@H_502_5@

iconv文件夹位置: cocos2d-x-2.0.4-1/iconv@H_502_5@

安卓环境汇总的 Android.mk: cocos2d-x-2.0.4-1/gameclient01/proj.android/jni/Android.mk@H_502_5@

第二个红圈增加了一个iconv_static,这个是在iconv/Android.mk中命名的。@H_502_5@

第三个红圈中的iconv其实就是我们下载的iconv库的文件夹名字。@H_502_5@

6、到此,配置就结束了。大家可以使用cygwin编译看看:@H_502_5@

@H_502_5@

7、在项目中使用:@H_502_5@

写两个函数:@H_502_5@

Convert(...),@H_502_5@

GBKToUTF8(...);@H_502_5@

文件:IconvString.h@H_502_5@


    #ifndef__ICONV_STRING_H__@H_502_5@@H_502_5@@H_502_5@
  1. #define__ICONV_STRING_H__@H_502_5@@H_502_5@@H_502_5@
  2. /*@H_502_5@@H_502_5@
  3. *字符转换函数集合@H_502_5@@H_502_5@
  4. *本文件为gbk形式@H_502_5@@H_502_5@
  5. */@H_502_5@@H_502_5@@H_502_5@
  6. //如果编译报错:size_t未找到,请包含以下头文件@H_502_5@@H_502_5@@H_502_5@
  7. #include<cstddef>@H_502_5@@H_502_5@@H_502_5@
  8. void@H_502_5@GBKToUTF8(@H_502_5@@H_589_404@char@H_502_5@*inbuf,@H_502_5@size_t@H_502_5@inlen,87); font-weight:bold; background-color:inherit">char@H_502_5@*outbuf,87); font-weight:bold; background-color:inherit">size_t@H_502_5@outlen);@H_502_5@@H_502_5@
  9. #endif//__ICONV_STRING_H__@H_502_5@@H_502_5@@H_502_5@

文件:IconvString.cpp@H_502_5@

@H_502_5@

    #include"IconvString.h"@H_502_5@@H_502_5@@H_502_5@
  1. #ifdefWIN32@H_502_5@@H_502_5@@H_502_5@
  2. #include"iconv.h"@H_502_5@@H_502_5@@H_502_5@
  3. #else@H_502_5@@H_502_5@@H_502_5@
  4. #include"../../../iconv/include/iconv.h"@H_502_5@@H_502_5@@H_502_5@
  5. #endif@H_502_5@@H_502_5@@H_502_5@
  6. #if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)@H_502_5@@H_502_5@@H_502_5@
  7. #pragmacomment(lib,"libiconv.lib")@H_502_5@@H_502_5@@H_502_5@
  8. #endif@H_502_5@@H_502_5@@H_502_5@
  9. static@H_502_5@@H_502_5@void@H_502_5@Convert(@H_502_5@char@H_502_5@*from_charset,87); font-weight:bold; background-color:inherit">char@H_502_5@*to_charset,87); font-weight:bold; background-color:inherit">size_t@H_502_5@outlen)@H_502_5@@H_502_5@
  10. {@H_502_5@
  11. iconv_ticonvH=iconv_open(to_charset,from_charset);@H_502_5@
  12. if@H_502_5@(!iconvH)@H_502_5@@H_502_5@
  13. return@H_502_5@;@H_502_5@@H_502_5@
  14. memset(outbuf,outlen);@H_502_5@
  15. const@H_502_5@@H_502_5@char@H_502_5@*pTemp=inbuf;@H_502_5@@H_502_5@
  16. const@H_502_5@@H_502_5@char@H_502_5@**pIn=&pTemp;@H_502_5@@H_502_5@
  17. char@H_502_5@**pOut=&outbuf;@H_502_5@@H_502_5@
  18. if@H_502_5@(!iconv(iconvH,pIn,&inlen,pOut,&outlen))@H_502_5@@H_502_5@
  19. iconv_close(iconvH);@H_502_5@
  20. return@H_502_5@;@H_502_5@@H_502_5@
  21. }@H_502_5@
  22. }@H_502_5@
  23. void@H_502_5@GBKToUTF8(@H_502_5@size_t@H_502_5@outlen)@H_502_5@@H_502_5@
  24. {@H_502_5@
  25. Convert("gb2312"@H_502_5@,@H_502_5@"utf-8"@H_502_5@,inbuf,inlen,outbuf,outlen);@H_502_5@@H_502_5@
  26. }@H_502_5@

    //示例文件使用的是默认的gbk文件@H_502_5@@H_502_5@@H_502_5@
  1. char@H_502_5@*pszBuffer=@H_502_5@"你好啊"@H_502_5@;@H_502_5@@H_502_5@
  2. size_t@H_502_5@inlen=strlen(pszBuffer);@H_502_5@@H_502_5@
  3. size_t@H_502_5@outlen<<1;@H_502_5@@H_502_5@
  4. char@H_502_5@*outlen=(@H_502_5@char@H_502_5@*)malloc(outlen);@H_502_5@@H_502_5@
  5. char@H_502_5@*pszBuffer2=@H_502_5@new@H_502_5@@H_502_5@char@H_502_5@[inlen];@H_502_5@@H_502_5@
  6. strncpy(pszBuffer2,pszBuffer,inlen);@H_502_5@
  7. GBKToUTF8(pszBuffer2,outlen);@H_502_5@
  8. //outbuf就是转好之后的字符串@H_502_5@@H_502_5@@H_502_5@

如果有遇到转码后少了一个字的,一定注意strncpy这一步。

猜你在找的Cocos2d-x相关文章