libiconv是一个常用的编码转换库,支持常用的多种编码之间的转换。在Linux下,工具链gcc有专门的libiconv库,所有不用移植,但在arm-linux下就没那么幸运了,需要我们额外移植libiconv库。以下是安装步骤
一、字符编码转换libiconv库介绍
libiconv是一个常用的编码转换库,支持常用的多种编码之间的转换。主要函数有:
#include
iconv_ticonv_open(constchar *tocode, const char *fromcode);
size_ticonv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
inticonv_close(iconv_tcd);
iconv_open是打开一个编码流,类似于打开一个编码管道(通道),出错则返回-1;
iconv用于具体输入的转换,如果出错,则返回 -1,否则返回 0;
iconv_close是关闭该管道(通道)。
如果对于大量需要转换的编码,上述函数covert不适合该方式,一是内存的限制不能一次调用,二是若分多次调用会频繁打开一个编码管道(通道),导致资源浪费,最好的办法还是拆开该函数根据情况使用。
二、arm-linux移植过程
1)http://www.gnu.org/software/libiconv/ 下载 libiconv-1.14.tar.gz
2)./configure --host=arm-linux- --prefix=/usr/local/iconv --enable-shared--enable-static
(根据自己的编译环境进行对应的修改,比如host:arm-linux --prefix:目录)
3) make
4) make install
三、实例icovtest.cpp
/************************************************************************/
/* src:原编码 UTF-8 UTF-16 GBK */
/* deec:要转换的编码 UTF-8 UTF-16 GBK*/
/* input:传入的字符串 ilen:传入的字符串长度*/
/* output:转换后的字符串 olen:转换的最大长度*/
/************************************************************************/
int covert(char *src, char *desc, char *input, size_t ilen, char *output, size_t olen)
{
char **pin = &input;
char **pout = &output;
iconv_t cd = iconv_open(desc, src);
if (cd == (iconv_t)-1)
{
return -1;
}
memset(output, 0, olen);
if (iconv(cd, pin, &ilen, pout, &olen)) return -1;
iconv_close(cd);
return 0;
}
void main(void *)
{
//转码测试
void UTF8_GB2312_test()
{
int i=0;
char *input = "土豆";
size_t len = strlen(input);
char *output = (char *)malloc(OUTLEN);
printf("输入:%s\n", input);
covert("GBK", "UTF-8", input, len, output, OUTLEN);//这里传出的长度就是output的开辟空间大小,要对应
printf("%s\n", output);
}