Cocos2d-x下使用iconv库

2023-10-25 11:20
文章标签 使用 cocos2d iconv

本文主要是介绍Cocos2d-x下使用iconv库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

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

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


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

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

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

     2、使用iconv库。

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

     3、使用xml文件读取。

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

    ___________________________________________________________

     iconv的配置使用过程:

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


    2、下载iconv库。

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

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

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

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


    3、解压iconv库

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

     

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

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

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

     

     Android.mk内容:

     

[cpp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. LOCAL_PATH:= $(call my-dir)  
  2. #libiconv.so  
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE := iconv_static  
  6.   
  7. LOCAL_MODULE_FILENAME := libiconv  
  8.   
  9. LOCAL_CFLAGS := \  
  10.   -Wno-multichar \  
  11.   -DAndroid \  
  12.   -DLIBDIR="c" \  
  13.   -DBUILDING_LIBICONV \  
  14.   -DIN_LIBRARY  
  15.   
  16. LOCAL_SRC_FILES := \  
  17.   libcharset/lib/localcharset.c \  
  18.   lib/iconv.c \  
  19.   lib/relocatable.c  
  20.   
  21. LOCAL_C_INCLUDES += \  
  22.   $(LOCAL_PATH)/include \  
  23.   $(LOCAL_PATH)/libcharset \  
  24.   $(LOCAL_PATH)/lib \  
  25.   $(LOCAL_PATH)/libcharset/include \  
  26.   $(LOCAL_PATH)/srclib  
  27. include $(BUILD_STATIC_LIBRARY)  

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

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

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

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

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

   

   请大家修改成这样:

   

   红色部分是修改的地方。

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

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

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


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

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


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

  

   

  7、在项目中使用:

   写两个函数:

   Convert(...),

   GBKToUTF8(...);

    头文件:IconvString.h


[cpp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. #ifndef __ICONV_STRING_H__  
  2. #define __ICONV_STRING_H__  
  3.   
  4. /* 
  5. * 字符转换函数集合 
  6. * 本文件为gbk形式 
  7. */  
  8.   
  9. // 如果编译报错:size_t未找到,请包含以下头文件  
  10. #include <cstddef>  
  11.   
  12. void GBKToUTF8(char* inbuf, size_t inlen, char* outbuf, size_t outlen);  
  13.   
  14. #endif // __ICONV_STRING_H__  

    

   源文件:IconvString.cpp

[cpp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. #include "IconvString.h"  
  2.   
  3. #ifdef WIN32  
  4. #include "iconv.h"  
  5. #else  
  6. #include "../../../iconv/include/iconv.h"  
  7. #endif  
  8.   
  9.   
  10. #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  11. #pragma comment(lib, "libiconv.lib")  
  12. #endif  
  13.   
  14. static void Convert(char* from_charset, char* to_charset, char* inbuf, size_t inlen, char* outbuf, size_t outlen)  
  15. {  
  16.     iconv_t iconvH = iconv_open(to_charset, from_charset);  
  17.     if(!iconvH)  
  18.         return;  
  19.     memset(outbuf, 0, outlen);  
  20. #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  21.     const char* pTemp = inbuf;  
  22.     const char** pIn = &pTemp;  
  23.     char** pOut = &outbuf;  
  24.     if(!iconv(iconvH, pIn, &inlen, pOut, &outlen))  
  25.     {  
  26.         iconv_close(iconvH);  
  27.         return;  
  28.     }  
  29. #else  
  30.     if(!iconv(iconvH, &inbuf, &inlen, &outbuf, &outlen))  
  31.     {  
  32.         iconv_close(iconvH);  
  33.         return;  
  34.     }  
  35. #endif  
  36.     iconv_close(iconvH);  
  37. }  
  38.   
  39. void GBKToUTF8(char* inbuf, size_t inlen, char* outbuf, size_t outlen)  
  40. {  
  41.     Convert("gb2312""utf-8", inbuf, inlen, outbuf, outlen);  
  42. }  

  

[cpp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. // 示例文件使用的是默认的gbk文件  
  2. const char* pszBuffer = "你好啊";  
  3. size_t inlen = strlen(pszBuffer);  
  4. size_t outlen << 1;  
  5. char* outlen = (char*)malloc(outlen);  
  6. char* pszBuffer2 = new char[inlen];  
  7. strncpy(pszBuffer2, pszBuffer, inlen);  
  8. GBKToUTF8(pszBuffer2, inlen, outbuf, outlen);  
  9. // outbuf就是转好之后的字符串  


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

这篇关于Cocos2d-x下使用iconv库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/282211

相关文章

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca