打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
利用iconv实现字符编码转换

http://blog.sina.com.cn/s/blog_6a1837e90100uf9t.html

2011

利用iconv实现字符编码转换:


int convert

(

  const char*from,       
  const char*to,        
  char*save,            
  intsavelen,           
  char*src,             
  intsrclen)            
{
 iconv_t cd;
 char *inbuf = src;
 char *outbuf = save;
 size_t outbufsize = savelen;
 int status = 0;
 size_t savesize = 0;
 size_t inbufsize = srclen;
 char* inptr = inbuf;
 size_t insize = inbufsize;
 char* outptr = outbuf;
 size_t outsize = outbufsize;

 cd = iconv_open(to, from);
 iconv(cd,NULL,NULL,NULL,NULL);
 if (inbufsize == 0)

 {
   status = -1;
   goto done;
 }
 while (insize > 0)

{
  size_t res =iconv(cd,&inptr,&insize,&outptr,&outsize);
  if (res == (size_t)(-1))

  {
   if (errno ==EILSEQ) {
    inptr++;
    status= -3;
   }

   else if(errno == EINVAL)

   {
    break;
   }

   else if(errno == E2BIG)

  {
    status= -5;
    gotodone;
   }

   else

   {
    status= -6;
    gotodone;
   }
  }
 }
 if (outptr != outbuf)

{
  int outsize = outptr -outbuf;
  strncpy(save+savesize, outbuf,outsize);
 }
 status = strlen(save);

done:
 iconv_close(cd);
 return status;
}
使用方法:
gchar *convert(gchar *from)
{
 char *result = g_new(char, strlen(from) * 3 +1);
 convert2("GBK", "UTF-8", result, strlen(from) * 3+ 1, from, strlen(from));
 if (result != NULL) return result;
 else return "";
}


PS:iconv参考说明:

iconv函数族的头文件是iconv.h,使用前需包含之。

    #include

iconv函数族有三个函数,原型如下:

    (1)iconv_t iconv_open(const char*tocode,const char *fromcode);

    此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。

    (2)size_t iconv(iconv_t cd,char**inbuf,size_t *inbytesleft,char **outbuf,size_t*outbytesleft);

    此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。

参数cd必须是由iconv_open函数创建的转换描述符。

大部分情形是inbuf不为NULL,*inbuf也不为NULL。这种情况下,iconv函数将以*inbuf起始的多字节序列转换到以*outbuf起始的多字节序列。从*inbuf开始读取,最多*inbytesleft字节,转换后,从*outbuf开始写入,最多*outbytesleft字节。

iconv函数一次转换一个多字节字符,每次字符转换,*inbuf增加已转换的字节数,*inbytesleft相应地减少已转换的字节数;对应地,*outbuf和*outbytesleft作相应的修改,同时修改cd的转换状态。

以下四种情况不能完成转换:

1.输入中含无效的多字节序列。此时,它将errno设置为EILSEQ并返回(size_t)(-1)。*inbuf指向无效序列的最左端。

2.输入的字节序列已经全部被转换过,也就是*inbytesleft减少至0。此时,iconv返回本次调用中完成转换的数目(可逆的转换不计入)。

3.输入中以不完整多字节序列作结尾。此时,它将errno设置为EINVAL并返回(size_t)(-1)。*inbuf指向不完整多字节序列的最左端。

4.输出缓存区没有足够空间来存储下一个字符。此时,它将errno设置为E2BIG并返回(size_t)(-1)。

另一种情形是inbuf 为NULL或*inbuf为NULL,但*outbuf不为NULL,*outbuf也不为NULL。这种情况下,iconv函数试图将cd的转换状态设置为初始状态并store acorresponding shift sequence at*outbuf。从*outbuf开始,最多写入*outbytesleft字节。如果输出缓存区没有足够空间来存储这个重置后的序列,他将errno设置为E2BIG并返回(size_t)(-1)。反之,*outbuf增加写入的字节数和*outbytesleft减少写入的字节数。

第三种情形是inbuf 为NULL或*inbuf为NULL,*outbuf为NULL或*outbuf为NULL。这种情况下,iconv函数试图将cd的转换状态设置为初始状态。

返回值

iconv函数返回本次调用中转换的字符数,可逆的转换不计入。出错时,它将修改errno并返回(size_t)(-1)。

错误

除了其它错误以外,出现以下错误:

E2BIG

*outbuf没有足够的空间。

EILSEQ

   输入含无效的多字节序列。

EINVAL

   输入含不完整多字节序列。

   (3)int iconv_close(iconv_t cd);

   此函数用于关闭转换句柄,释放资源。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux下转换字符集(UTF8转换)
Linux两个函数mbstowcs() 与wcstombs()
怎样学习使用libiconv库 - My Study
iconv使用
iconv 文件编码转换
iconv实现通用语言编码转换|iconv,通用,语言,编码转换
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服