源文:https://blog.youkuaiyun.com/qq_26006367/article/details/76147638
一、iconv交叉编译
这个网上说明很多,再次不做过多说明
libiconv下载地址:http://www.gnu.org/software/libiconv/
下载解压完毕后:
./configure -prefix=/home/XNET/arm-libiconv-1.15-2017-7-26 CC=arm-linux-gcc -host=arm-linux -enable-shared -enable-static
make
make install
编译出动态库preloadable_libiconv.so
二、 移植说明
(1) 将文件夹中的动态库移植到ARM-Linux中的/usr/local/lib文件夹中
(2) 在/etc/profile中将此动态库加入环境变量
export LD_PRELOAD=/usr/local/lib/preloadable_libiconv.so
(3) 输入命令,使环境变量立即生效
source /etc/profile
至此,移植完毕,程序中,可使用iconv相关函数进行编码转换
三、 iconv模块说明
/********************
*iconv头文件
********************/
#include<iconv.h>
/********************
*函数名:code_convert
*函数作用:将输入缓冲区中的字符串,按照指定编码进行转换,写入输出缓冲区。
*参数:
from_charset:原始编码格式
to_charset:目标编码格式
inbuf:输入缓冲区,存储待转换字符串
inlen:输入字符串长度
outbuf:输出缓冲区,存储转换完毕的字符串
outlen:输出缓冲区长度
********************/
intcode_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char*outbuf,int outlen)
{
iconv_t cd;
int rc;
char **pin=&inbuf;
char **pout=&outbuf;
cd=iconv_open(to_charset,from_charset);
if (cd == (iconv_t)-1)
{
perror("iconv_open");
return -1;
}
printf("inbuf=%s\n",inbuf);
memset(outbuf,0,outlen);
if(iconv(cd,pin,&inlen,pout,&outlen)==-1)
return -2;
//printf("outbuf=%s\n",outbuf);
iconv_close(cd);
return 0;
}
/********************
*函数名:u2g
*函数作用:UTF-8编码字符串转为GB2312编码字符串
*参数:
inbuf:输入缓冲区,存储待转换字符串
inlen:输入字符串长度
outbuf:输出缓冲区,存储转换完毕的字符串
outlen:输出缓冲区长度
********************/
intu2g(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
returncode_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
/********************
*函数名:g2u
*函数作用:GB2312编码字符串转为UTF-8编码字符串
*参数:
inbuf:输入缓冲区,存储待转换字符串
inlen:输入字符串长度
outbuf:输出缓冲区,存储转换完毕的字符串
outlen:输出缓冲区长度
********************/
intg2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
returncode_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}