1.安装
$ tar zxvf libiconv-1.14.tar.gz
$ cd libiconv-1.14
$ CC=arm-hisiv100nptl-linux-gcc ./configure --prefix=`pwd`/res_iconv --host=arm-hisiv100nptl-linux --enable-static=yes --enable-shared=no
$ make
$ make install
$ ls res_iconv/
bin include lib share
2.使用
$ cd res_iconv/
$ vi convert.c
2.1编写实例代码
/*
* 名称: convert.c
* 时间: 2019-10-09 10:51:19
*/
#include <iconv.h>
#include <stdio.h>
#include <string.h>
int GB2312_To_UTF8(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
iconv_t cd;
char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open("UTF-8","GB2312");
//printf("cd = %d=\n",cd);
if (cd==0 || cd == (iconv_t)-1)
{
perror("iconv_open");
return -1;
}
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen) == -1)
{
perror("iconv");
return -1;
}
iconv_close(cd);
return 0;
}
int main(){
char src[128] = "d7\xc7\xbe\xc6\xd2\xbb\xb1\xad";//"浊酒一杯"GB2312的16进制, 这里可以直接在GB2312的编译器直接写"浊酒一杯"字符串
char dst[128] = {0};
size_t srclen = sizeof(src);//128;
size_t dstlen = sizeof(dst);
int ret_conv = GB2312_To_UTF8(src,srclen,dst,dstlen);
if(ret_conv != -1)
printf("GB2312-src is %s\ndst is %s\n",src,dst);
return 0;
}
2.2 先使用当前ubuntu系统编写测试代码
uname -v //查看当前系统版本
iconv --version //查看当前系统是否安装了iconv,且查看其版本
gcc convert.c //编译当前的可执行程序
kd@ubuntu:/home/samba/tmp/libiconv-1.14-/res_iconv$ uname -v
#37-Ubuntu SMP Wed Apr 25 10:47:59 UTC 2012
kd@ubuntu:/home/samba/tmp/libiconv-1.14-/res_iconv$ iconv --version
iconv (Ubuntu EGLIBC 2.15-0ubuntu10) 2.15
版权所有 (C) 2012 Free Software Foundation, Inc.
这是自由软件;请参考原始码的版权声明。本软件不提供任何担保,甚至不会包括可售性或适用于任何特定目的的担保。
由 Ulrich Drepper 编写。
kd@ubuntu:/home/samba/tmp/libiconv-1.14-/res_iconv$ gcc convert.c
kd@ubuntu:/home/samba/tmp/libiconv-1.14-/res_iconv$ ./a.out
iconv: Invalid or incomplete multibyte or wide character
iconv: Invalid or incomplete multibyte or wide character 经不断排查,觉得是输入和输出缓冲区大小有问题,将main函数第三行改成如下语句
size_t srclen = strlen(src);//128;
保存后,重新编译执行
kd@ubuntu:/home/samba/tmp/libiconv-1.14-/res_iconv$ gcc convert.c
kd@ubuntu:/home/samba/tmp/libiconv-1.14-/res_iconv$ ./a.out
iconv: Invalid argument
iconv: Invalid argument // 经排查确定是输入的字符串编码有问题,将main函数第1行改成如下语句
char src[128] = "\xd7\xc7\xbe\xc6\xd2\xbb\xb1\xad";
保存后,重新编译执行,在UTF-8的终端能够打印出代码里的字符串,则说明例子是可行的