分享

UTF8转GB2312的问题,交叉环境中又不存在iconv函

 mrjbydd 2013-09-04
前段在做一个嵌入式项目时碰到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 <stdio.h>

#include <stdlib.h>

#include <memory.h>

#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 <stdio.h>

 

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="<<r1<<"gb2312-->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之间的转换,其它的编码转换不需要,不知有没有简捷的方法,好像说可利用什么转换表什么的,希望那位高手能指点下:)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多