因为在项目中需要同时维护ios和android,不同的代码不利于开发的便捷和以后的维护,所以在最近的一个项目中,两种手机应用的通信部分打算使用c/c++库来统一编写,ios调用.a静态库,android调用.so动态库的方式来实现。
由于通信时,从服务端获取到的中文数据为GBK编码,android和ios通过c++库获取到的中文乱码,于是打算在c++库层统一将GBK转成UTF-8后再传递给上层应用。
由于优先考虑跨平台的方案,最终我采用iconv库来实现转码功能。参考网上搜到的一个代码如下
#ifndef STRINGUTIL_H_
#define STRINGUTIL_H_
#include <cstring>
#include <iconv.h>
#ifdef _WIN32
#pragma comment(lib,"iconv.lib")
#endif
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 **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
iconv(cd, const_cast<char**>(pin), &inlen,pout, &outlen);
iconv_close(cd);
return 0;
}
/* UTF-8 to GBK */
int u2g(const char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
return code_convert("UTF-8","GBK",inbuf,inlen,outbuf,outlen);
}
/* GBK to UTF-8 */
int g2u(const char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
return code_convert("GBK", "UTF-8", inbuf, inlen, outbuf, outlen);
}
#endif /* STRINGUTIL_H_ */
</span>
代码用g++编译,在ubuntu上测试正常,但在移植到ios和android均出现问题。
1.首先讲ios上出现的问题,这个比较简单。
使用xcode能够成功编译出.a静态库,但是在ios应用编译时,出现如下问题:
Undefined symbols for architecture x86_64:
"_iconv", referenced from:
code_convert(char const*, char const*, char const*, unsigned long, char*, unsigned long) in libVmNet.a(VmNet-EA133239D29A369D.o)
"_iconv_close", referenced from:
code_convert