Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131236
  • 博文数量: 33
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 452
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-01 13:32
文章分类
文章存档

2010年(1)

2009年(32)

我的朋友

分类: 嵌入式

2009-08-04 19:46:14

前段在做一个嵌入式项目时碰到UTF8GB2312的问题,交叉环境中又不存在iconv函数,原来是没提供iconv库。于是就在网上搜索了下,找到一种方法——用开源的库(libiconv,这个库功能好全,好大!!)

先下载libiconv库,我用的是libiconv-1.12,解压后进行交叉编译:

./configure --host=arm –prefix=/home/my/iconv/

 CXX=arm -linux-gnu-g++   CC=arm -linux-gnu-gcc-3.4.5

LDFLAGS="-L/opt/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/lib" CPPFLAGS="-I/opt/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/include"

 

Make

Make install

 

/home/my/iconv/下的lib文件夹中就有了libiconv.a库以及include文件夹中的iconv.h;之后就可用它们来写转码程序:

 

#include

#include

#include

#include "iconv.h"                     //这里要用” “,不能用<>

 

class CodeConverter

{

private:

       iconv_t cd;

      

public:

       CodeConverter(const char *from,const char *to);

       ~CodeConverter();

 

       // 转换输出

       int convert(char *inbuf,int inlen,char *outbuf,int outlen);

};

 

-------------------------------------------------------------------------------------------------

#include "CodeConverter.h"

 

 

CodeConverter::CodeConverter(const char *from,const char *to)

{

       cd = iconv_open(to,from);

      

       if(cd == (iconv_t)-1)

              printf("cd -1\n");

}

 

CodeConverter::~CodeConverter()

{

       iconv_close(cd);

}

 

// 转换输出

int CodeConverter::convert(char *inbuf,int inlen,char *outbuf,int outlen)

{

       char **pin = &inbuf;

       char **pout = &outbuf;

 

       memset(outbuf,0,outlen);

       return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);

}

 

 

#include "CodeConverter.h"

#include

 

int main(int argc, char **argv)

{

char *in_gb2312 = "http://4.521c.com/jrt945j2//newmoive/特洛伊.rmvb";

char out[1024];

 

// gb2312-->utf-8

CodeConverter cc2 = CodeConverter("gb2312","utf-8");

int r1 = cc2.convert(in_gb2312,strlen(in_gb2312),out,1024);

//cout << "r1="<utf-8 in=" << in_gb2312 << ",out=" << out << endl;

printf("r1:%d      in:%s    out:%s\n",r1,in_utf8,out);

 

}

 

arm -linux-gnu-gcc  –c CodeConverter.c

arm -linux-gnu-gcc  –o main CodeConverter.o main.c –L./ -liconv

 

问题是生成的文件有1M多大!主是那个iconv库有1M,不知能不能变小。再者我的程序只需实现UTF8GB2312之间的转换,其它的编码转换不需要,不知有没有简捷的方法,好像说可利用什么转换表什么的,希望那位高手能指点下:)


PS:

作者使用的是静态链接库,也可以使用动态库,应该能减小体积.

阅读(4371) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~