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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念