免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4573 | 回复: 2
打印 上一主题 下一主题

[C++] 请教iconv转换问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-27 09:08 |只看该作者 |倒序浏览
#include </home/test/iconv-1.8/lib/include/iconv.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char tmputf8[10] = "test";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *inbuf_utf8 = tmp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//char tmpout[50] ={0};//位置1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int  ilen = strlen(inbuf_utf8);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char tmpgbk[50] ={0};//位置2

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *outbuf_gbk = tmpout;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int  olen = 50;


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("utf8:%s\n",inbuf_utf8);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("instr.len:%d\n",ilen);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_t  cd;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cd = iconv_open ("GBK","UTF-8");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cd == (iconv_t)(-1))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("iconv_open error for %s\n",strerror(errno));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv(cd,NULL,NULL,NULL,NULL);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int ret = iconv(cd,&inbuf_utf8,(size_t*)&ilen,&outbuf_gbk,(size_t*)&olen);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(cd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( ret < 0 ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("iconv_conv error for %s\n",strerror(errno));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("iconv_conv succeed for %d\n",ret);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("utf8:%s\n",inbuf_utf8);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("instr.len:%d\n",ilen);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("gbk:%s\n",outbuf_gbk);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("gbkstr.len:%d\n",olen);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("gbkstr.len:%d\n",strlen(outbuf_gbk));

}


编译环境:libiconv1.8,gcc 3.2.3,2.6.9的x86_64的linux

遇到的问题:将位置1注销,iconv的返回值为-1,错误信息:Invalid or incomplete multibyte or wide character,但iconv能将utf-8转换成gbk,而且olen值为32
将位置2注销,iconv返回值为0,但是iconv不能将utf-8转换成gbk,但是olen值为4.

请各位看看为什么会出现这种情况?我该怎么将utf-8转换成gbk?

论坛徽章:
0
2 [报告]
发表于 2009-05-27 12:35 |只看该作者
顶下,没人知道吗?

论坛徽章:
0
3 [报告]
发表于 2009-05-27 14:03 |只看该作者
static int long_iconv (char *encfrom, char *encto, char *bufin, char *bufout)
{
       char            *sin, *sout;
       size_t          lenin, lenout;
       int             ret;
       iconv_t         c_pt;

       if ((c_pt = iconv_open(encto, encfrom)) == (iconv_t)(-1))
              return -1;

       lenin = strlen(bufin)+1;
       lenout = (strlen(bufin)+1)*10;
       sin = bufin;
       sout = bufout;
       ret = iconv(c_pt, (const char **)&sin, &lenin, &sout, &lenout);
      
       iconv_close(c_pt);

       return ret == (size_t)-1 ? -1 : 0 ;

}


long_iconv("UTF-8","GB2312",bufIN,bufOut);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP